mcpField
T
tools-and-context

tools-and-context

github.com/tambo-aiDevelopment11.2k97 installsUpdated 3w ago
Repository

About tools-and-context

A Tambo skill for providing application data and capabilities through custom tools, MCP servers, and context. It covers server and client MCP setup, dynamic context helpers, attachments, and mentionable resources.

Key features

  1. 01Register JavaScript tools with schemas
  2. 02Connect MCP servers on server or client
  3. 03Add and remove dynamic context helpers
  4. 04Attach one-time context to messages
  5. 05Register static and dynamic resources

Use cases

  1. 01Expose application functions to Tambo
  2. 02Connect external MCP tools and resources
  3. 03Provide page state or selected files as context
  4. 04Let users reference documentation by mention

MCP support

Describes connecting MCP servers to Tambo from the dashboard or React client, using StreamableHTTP or SSE. MCP servers can provide tools, resources, and prompts.

Install

Copy the command and run it in a terminal.

$npx skills add https://github.com/tambo-ai/tambo --skill tools-and-context

After installing, type/tools-and-contextin Claude Code to confirm it loaded.

Details

From the project README

Tools and Context

Gives Tambo access to data and capabilities through tools, MCP servers, and context.

Quick Start

// Custom tool Tambo can call
const fetchUserTool = defineTool({
  name: "fetchUser",
  description: "Fetch user by ID",
  inputSchema: z.object({ userId: z.string() }),
  tool: async ({ userId }) => fetchUser(userId),
});

<TamboProvider tools={[fetchUserTool]}>
  <App />
</TamboProvider>;

Custom Tools

Register JavaScript functions Tambo can call:

import { defineTool, TamboProvider } from "@tambo-ai/react";
import { z } from "zod";

const fetchUserTool = defineTool({
  name: "fetchUser",
  description: "Fetch a user by ID",
  inputSchema: z.object({
    userId: z.string().describe("The user ID to fetch"),
  }),
  outputSchema: z.object({
    name: z.string(),
    email: z.string(),
  }),
  tool: async ({ userId }) => {
    const user = await fetchUser(userId);
    return user;
  },
});

<TamboProvider tools={[fetchUserTool]} components={components}>
  <App />
</TamboProvider>;
Tool Key Points
  • inputSchema: Zod object for parameters, use .describe() on fields
  • outputSchema: Zod schema for return value (optional)
  • tool: Function receives single object with input params
  • transformToContent: Enable rich content responses (images, formatted text)

MCP Servers

Connect to external MCP servers for tools, resources, prompts:

FeatureServer-sideClient-side
PerformanceFast (direct)Slower (browser proxies)
AuthOAuth + API keysBrowser session only
Local serversNoYes (localhost)
ConfigTambo dashboardReact code
Server-Side Setup
  1. Go to project dashboard
  2. Click "Add MCP Server"
  3. Enter URL and server type (StreamableHTTP or SSE)
  4. Complete OAuth if required
Client-Side Setup
npm install @modelcontextprotocol/sdk@^1.24.0 zod@^4.0.0 zod-to-json-schema@^3.25.0
import { TamboProvider } from "@tambo-ai/react";
import { MCPTransport } from "@tambo-ai/react/mcp";

<TamboProvider
  mcpServers={[
    {
      url: "http://localhost:8123/",
      serverKey: "local",
      transport: MCPTransport.HTTP,
    },
  ]}
>
  <App />
</TamboProvider>;

Context Helpers

Provide dynamic context on every message:

<TamboProvider
  contextHelpers={{
    currentPage: () => ({ url: window.location.href }),
    currentTime: () => ({ time: new Date().toISOString() }),
    selectedItems: () => selectedItems.map((i) => i.name),
  }}
>
  <App />
</TamboProvider>
Dynamic Context Helpers

Add/remove helpers at runtime:

const { addContextHelper, removeContextHelper } = useTamboContextHelpers();

useEffect(() => {
  addContextHelper("project", () => ({ projectId, projectName }));
  return () => removeContextHelper("project");
}, [projectId, projectName, addContextHelper, removeContextHelper]);

Context Attachments

One-time context for the next message (cleared after sending):

const { addContextAttachment, attachments, removeContextAttachment } =
  useTamboContextAttachment();

function handleSelectFile(file) {
  addContextAttachment({
    context: file.content,
    displayName: file.name,
    type: "file",
  });
}

Local Resources

Register @ mentionable resources users can reference in messages:

Static Resources
import { TamboProvider, ListResourceItem } from "@tambo-ai/react";

const resources: ListResourceItem[] = [
  { uri: "docs://api", name: "API Reference", mimeType: "text/plain" },
  { uri: "docs://faq", name: "FAQ", mimeType: "text/plain" },
];

const getResource = async (uri: string) => {
  const content = await fetchDoc(uri);
  return { contents: [{ uri, mimeType: "text/plain", text: content }] };
};

<TamboProvider resources={resources} getResource={getResource}>
  <App />
</TamboProvider>;
Dynamic Resources
const listResources = async (search?: string) => {
  const docs = await fetchDocs();
  return docs
    .filter((d) => !search || d.name.includes(search))
    .map((d) => ({
      uri: `docs://${d.id}`,
      name: d.title,
      mimeType: "text/plain",
    }));
};

const getResource = async (uri: string) => {
  const doc = await fetchDocument(uri);
  return { contents: [{ uri, mimeType: "text/plain", text: doc.content }] };
};

// Both listResources and getResource must be provided together
<TamboProvider listResources={listResources} getResource={getResource}>
  <App />
</TamboProvider>;
Programmatic Registration
const { registerResource, registerResources } = useTamboRegistry();

// Single resource
registerResource({
  uri: "user://file.txt",
  name: "File",
  mimeType: "text/plain",
});

// Batch registration
registerResources(
  docs.map((d) => ({
    uri: `docs://${d.id}`,
    name: d.title,
    mimeType: "text/plain",
  })),
);
Context Types Summary
TypeWhen CalledUse Case
Context HelpersEvery messageAmbient state (current page, time)
Context AttachmentsNext message onlyUser-selected files, selections
ResourcesWhen @ mentionedDocumentation, searchable data

Comments

Markdown supported