ai-mcp
Config-driven MCP (Model Context Protocol) server integration. Add external tool servers (GitHub, Brave Search, databases, etc.) by editing one config file — tools are auto-discovered, prefixed, and merged into the chat. Use this skill when the user says "add MCP", "connect MCP servers", "add external tools", or "setup ai-mcp".
What this skill does
# AI MCP
Config-driven MCP server integration for the AI chat system. Users add MCP servers by editing **one config file** (`src/lib/ai/mcp/servers.ts`). Tools from all configured servers are automatically discovered, prefixed to avoid collisions, merged into the chat, and described in the system prompt.
## Prerequisites
- `ai-chat` skill applied (provides `route.ts` with comment slots)
- `ai-tools` skill applied (provides tool infrastructure)
- `ai-core` skill applied (provides `getModel()`)
## Installation
```bash
bun add @ai-sdk/mcp
```
## What Gets Created
```
src/
└── lib/
└── ai/
└── mcp/
├── servers.ts # Server config array — edit this to add servers
└── client.ts # connectMCPServers() factory
```
Plus modification to:
```
src/app/api/ai/chat/route.ts # MODIFIED — connect MCP, merge tools, close clients
```
## Comment Slots
- **route.ts**: `// [ai-mcp]: merge MCP server tools` — merges auto-discovered MCP tools into the tools object
- **route.ts**: `// [ai-mcp]: append MCP tool descriptions` — adds MCP server descriptions to the system prompt
- **route.ts**: `// [ai-mcp]: close MCP server connections` — closes MCP clients in `onFinish`
## Setup Steps
### Step 1: Create `src/lib/ai/mcp/servers.ts`
```typescript
type MCPTransportConfig = {
type: "sse" | "http";
url: string;
headers?: Record<string, string>;
};
export type MCPServerConfig = {
/** Unique name for this server (used as tool prefix) */
name: string;
/** Human-readable description shown to the AI in the system prompt */
description: string;
/** Transport configuration — use "http" for modern servers, "sse" for legacy */
transport: MCPTransportConfig;
/** Set to false to temporarily disable without removing config. Defaults to true. */
enabled?: boolean;
/** Custom tool name prefix. Defaults to the server name. Set to "" to disable prefixing. */
toolPrefix?: string;
};
/**
* Add your MCP servers here. Each entry auto-discovers tools from the server
* and merges them into the AI chat. Tool names are prefixed with the server
* name (e.g. "github_create_issue") to prevent collisions.
*
* Example:
*
* {
* name: "brave-search",
* description: "Web search via Brave Search API",
* transport: {
* type: "http",
* url: "https://mcp.brave.com/sse",
* headers: { Authorization: `Bearer ${process.env.BRAVE_API_KEY}` },
* },
* },
* {
* name: "github",
* description: "GitHub repository management — issues, PRs, code search",
* transport: {
* type: "http",
* url: "https://mcp.github.com/sse",
* headers: { Authorization: `Bearer ${process.env.GITHUB_TOKEN}` },
* },
* },
*/
export const mcpServers: MCPServerConfig[] = [
// Add your MCP server configs here
];
```
### Step 2: Create `src/lib/ai/mcp/client.ts`
```typescript
import { createMCPClient } from "@ai-sdk/mcp";
import type { ToolSet } from "ai";
import type { MCPServerConfig } from "./servers";
type MCPConnection = {
tools: ToolSet;
systemPrompt: string;
close: () => Promise<void>;
};
type MCPClient = Awaited<ReturnType<typeof createMCPClient>>;
function prefixTools(tools: ToolSet, prefix: string): ToolSet {
if (!prefix) return tools;
const prefixed: ToolSet = {};
for (const [name, tool] of Object.entries(tools)) {
prefixed[`${prefix}_${name}`] = tool;
}
return prefixed;
}
export async function connectMCPServers(
servers: MCPServerConfig[],
): Promise<MCPConnection> {
const enabledServers = servers.filter((s) => s.enabled !== false);
if (enabledServers.length === 0) {
return { tools: {}, systemPrompt: "", close: async () => {} };
}
const clients: MCPClient[] = [];
const allTools: ToolSet = {};
const descriptions: string[] = [];
const results = await Promise.allSettled(
enabledServers.map(async (server) => {
const client = await createMCPClient({
transport: server.transport,
});
const tools = await client.tools();
return { server, client, tools };
}),
);
for (const result of results) {
if (result.status === "fulfilled") {
const { server, client, tools } = result.value;
clients.push(client);
const prefix =
server.toolPrefix !== undefined ? server.toolPrefix : server.name;
const prefixed = prefixTools(tools, prefix);
Object.assign(allTools, prefixed);
const toolNames = Object.keys(prefixed);
if (toolNames.length > 0) {
descriptions.push(
`- **${server.name}**: ${server.description} (tools: ${toolNames.join(", ")})`,
);
}
} else {
const serverName =
enabledServers[results.indexOf(result)]?.name ?? "unknown";
console.warn(
`[ai-mcp] Failed to connect to "${serverName}":`,
result.reason,
);
}
}
const systemPrompt =
descriptions.length > 0
? `## MCP Tools\nThe following external tool servers are available:\n${descriptions.join("\n")}`
: "";
return {
tools: allTools,
systemPrompt,
close: async () => {
await Promise.allSettled(clients.map((c) => c.close()));
},
};
}
```
### Step 3: Modify `src/app/api/ai/chat/route.ts`
Add the MCP imports at the top of the file.
Find this:
```typescript
import { allTools } from "@/lib/ai/tools";
```
Replace with:
```typescript
import { allTools } from "@/lib/ai/tools";
import { connectMCPServers } from "@/lib/ai/mcp/client";
import { mcpServers } from "@/lib/ai/mcp/servers";
```
Next, connect MCP servers and merge their tools. Find this:
```typescript
// --- TOOLS (ai-tools registers, ai-artifacts/tasks/memory/gen-ui add tools) ---
const tools: ToolSet = {};
```
Replace with:
```typescript
// --- MCP (connect external tool servers) ---
const mcp = await connectMCPServers(mcpServers);
// --- TOOLS (ai-tools registers, ai-artifacts/tasks/memory/gen-ui add tools) ---
const tools: ToolSet = {};
```
Next, merge MCP tools after existing tools. Find this:
```typescript
const memoryTools = createMemoryTools(userId);
Object.assign(tools, memoryTools);
```
Replace with:
```typescript
const memoryTools = createMemoryTools(userId);
Object.assign(tools, memoryTools);
// [ai-mcp]: merge MCP server tools
Object.assign(tools, mcp.tools);
```
Next, append MCP tool descriptions to the system prompt. Find this:
```typescript
// --- PROVIDER OPTIONS (ai-reasoning adds thinking config) ---
```
Replace with:
```typescript
// [ai-mcp]: append MCP tool descriptions
if (mcp.systemPrompt) {
systemParts.push(mcp.systemPrompt);
}
// --- PROVIDER OPTIONS (ai-reasoning adds thinking config) ---
```
Finally, close MCP clients in `onFinish`. Find this:
```typescript
async onFinish({ text }) {
// Persist the assistant's response
```
Replace with:
```typescript
async onFinish({ text }) {
// [ai-mcp]: close MCP server connections
await mcp.close();
// Persist the assistant's response
```
## Usage
### Adding an MCP Server
1. Add any required API keys to `.env.local`:
```
BRAVE_API_KEY=your-key-here
```
2. Add a server config to the `mcpServers` array in `src/lib/ai/mcp/servers.ts`:
```typescript
export const mcpServers: MCPServerConfig[] = [
{
name: "brave-search",
description: "Web search via Brave Search API",
transport: {
type: "http",
url: "https://mcp.brave.com/sse",
headers: { Authorization: `Bearer ${process.env.BRAVE_API_KEY}` },
},
},
];
```
3. Restart the dev server. The AI can now use all tools from that server, prefixed as `brave-search_web_search`, etc.
### Disabling a Server
Set `enabled: false` to temporarily disable a server without removing its config:
```typescript
{
name: "github",
description: "GitHub repo management",
transport: { type: "http", url: "https://mcp.github.com/sse" },
enabled: false, // temporarily disaRelated in AI Agents
skill-development
IncludedComprehensive meta-skill for creating, managing, validating, auditing, and distributing Claude Code skills and slash commands (unified in v2.1.3+). Provides skill templates, creation workflows, validation patterns, audit checklists, naming conventions, YAML frontmatter guidance, progressive disclosure examples, and best practices lookup. Use when creating new skills, validating existing skills, auditing skill quality, understanding skill architecture, needing skill templates, learning about YAML frontmatter requirements, progressive disclosure patterns, tool restrictions (allowed-tools), skill composition, skill naming conventions, troubleshooting skill activation issues, creating custom slash commands, configuring command frontmatter, using command arguments ($ARGUMENTS, $1, $2), bash execution in commands, file references in commands, command namespacing, plugin commands, MCP slash commands, Skill tool configuration, or deciding between skills vs slash commands. Delegates to docs-management skill for official documentation.
reprompter
IncludedTransform messy prompts into well-structured, effective prompts — single or multi-agent. Use when: "reprompt", "reprompt this", "clean up this prompt", "structure my prompt", rough text needing XML tags and best practices, "reprompter teams", "repromptception", "run with quality", "smart run", "smart agents", multi-agent tasks, audits, parallel work, anything going to agent teams. Don't use when: simple Q&A, pure chat, immediate execution-only tasks. See "Don't Use When" section for details. Outputs: Structured XML/Markdown prompt, quality score (before/after), optional team brief + per-agent sub-prompts, agent team output files. Success criteria: Single mode quality score ≥ 7/10; Repromptception per-agent prompt quality score 8+/10; all required sections present, actionable and specific.
adaptive-compaction
IncludedAdaptive add-on policy and recovery layer that decides WHEN to compact, prune, snapshot, or fork -- replacing fixed-percent auto-compaction across Claude Code, Codex, and MCP-capable hosts. Trigger on auto-compact timing or damage: "when should I compact", "is it safe to compact now or start a fresh session", "auto-compact fires too early/mid-task", "switching to an unrelated task but the window still has space", "context rot", "answers get worse the longer the session runs", "the agent forgot the plan or my decisions after it summarized", "add a layer on top that manages context without changing the agent", raising autoCompactWindow to give the policy room, or installing/tuning a cross-tool compaction policy or PreCompact hook -- even when "compaction" is never said but the problem is context-window pressure or post-summarization memory loss. Do NOT use to summarize a conversation, build RAG, write a summarization prompt (decides WHEN not HOW), or answer max-context-length trivia.
agent-skill-creator
IncludedCreate cross-platform agent skills from workflow descriptions. Activates when users ask to create an agent, automate a repetitive workflow, create a custom skill, or need advanced agent creation. Triggers on phrases like create agent for, automate workflow, create skill for, every day I have to, daily I need to, turn process into agent, need to automate, create a cross-platform skill, validate this skill, export this skill, migrate this skill. Supports single skills, multi-agent suites, transcript processing, template-based creation, interactive configuration, cross-platform export, and spec validation.
llm-wiki
IncludedUse when building or maintaining a persistent personal knowledge base (second brain) in Obsidian where an LLM incrementally ingests sources, updates entity/concept pages, maintains cross-references, and keeps a synthesis current. Triggers include "second brain", "Obsidian wiki", "personal knowledge management", "ingest this paper/article/book", "build a research wiki", "compound knowledge", "Memex", or whenever the user wants knowledge to accumulate across sessions instead of being re-derived by RAG on every query.
skill-master
IncludedAgent Skills authoring, evaluation, and optimization. Create, edit, validate, benchmark, and improve skills following the agentskills.io specification. Use when designing SKILL.md files, structuring skill folders (references, scripts, assets), ingesting external documentation into skills, running trigger evals, benchmarking skill quality, optimizing descriptions, or performing blind A/B comparisons. Keywords: agentskills.io, SKILL.md, skill authoring, eval, benchmark, trigger optimization.