---
name: tools-and-context
description: Provides Tambo with data and capabilities via custom tools, MCP servers, context helpers, and resources. Use when registering tools Tambo can call, connecting MCP servers, adding context to messages, implementing @mentions, or providing additional data sources with defineTool, mcpServers, contextHelpers, or useTamboContextAttachment.
---
# Tools and Context
Gives Tambo access to data and capabilities through tools, MCP servers, and context.
## Quick Start
```tsx
// 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),
});
;
```
## Custom Tools
Register JavaScript functions Tambo can call:
```tsx
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;
},
});
;
```
### 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:
| Feature | Server-side | Client-side |
| ------------- | ---------------- | ------------------------ |
| Performance | Fast (direct) | Slower (browser proxies) |
| Auth | OAuth + API keys | Browser session only |
| Local servers | No | Yes (localhost) |
| Config | Tambo dashboard | React code |
### Server-Side Setup
1. Go to [project dashboard](https://console.tambo.co)
2. Click "Add MCP Server"
3. Enter URL and server type (StreamableHTTP or SSE)
4. Complete OAuth if required
### Client-Side Setup
```bash
npm install @modelcontextprotocol/sdk@^1.24.0 zod@^4.0.0 zod-to-json-schema@^3.25.0
```
```tsx
import { TamboProvider } from "@tambo-ai/react";
import { MCPTransport } from "@tambo-ai/react/mcp";
;
```
## Context Helpers
Provide dynamic context on every message:
```tsx
({ url: window.location.href }),
currentTime: () => ({ time: new Date().toISOString() }),
selectedItems: () => selectedItems.map((i) => i.name),
}}
>
```
### Dynamic Context Helpers
Add/remove helpers at runtime:
```tsx
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):
```tsx
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
```tsx
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 }] };
};
;
```
### Dynamic Resources
```tsx
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
;
```
### Programmatic Registration
```tsx
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
| Type | When Called | Use Case |
| ------------------- | ----------------- | ---------------------------------- |
| Context Helpers | Every message | Ambient state (current page, time) |
| Context Attachments | Next message only | User-selected files, selections |
| Resources | When @ mentioned | Documentation, searchable data |