Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions .changeset/long-spies-peel.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
---
'workers-observability': minor
'workers-bindings': minor
'docs-vectorize': minor
'@repo/mcp-common': minor
---

Add search docs tool to bindings and obs servers
7 changes: 3 additions & 4 deletions apps/docs-vectorize/src/docs-vectorize.app.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,9 @@ import { McpAgent } from 'agents/mcp'

import { createApiHandler } from '@repo/mcp-common/src/api-handler'
import { getEnv } from '@repo/mcp-common/src/env'
import { registerPrompts } from '@repo/mcp-common/src/prompts/docs-vectorize.prompts'
import { CloudflareMCPServer } from '@repo/mcp-common/src/server'

import { registerPrompts } from './prompts/docs-vectorize.prompts'
import { registerDocsTools } from './tools/docs-vectorize.tools'
import { registerDocsTools } from '@repo/mcp-common/src/tools/docs-vectorize.tools'

import type { Env } from './docs-vectorize.context'

Expand Down Expand Up @@ -33,7 +32,7 @@ export class CloudflareDocumentationMCP extends McpAgent<Env, State, Props> {
}

async init() {
registerDocsTools(this)
registerDocsTools(this, this.env)
registerPrompts(this)
}
}
Expand Down
6 changes: 6 additions & 0 deletions apps/workers-bindings/src/bindings.app.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,12 @@ import {
} from '@repo/mcp-common/src/cloudflare-oauth-handler'
import { getUserDetails, UserDetails } from '@repo/mcp-common/src/durable-objects/user_details.do'
import { getEnv } from '@repo/mcp-common/src/env'
import { registerPrompts } from '@repo/mcp-common/src/prompts/docs-vectorize.prompts'
import { RequiredScopes } from '@repo/mcp-common/src/scopes'
import { CloudflareMCPServer } from '@repo/mcp-common/src/server'
import { registerAccountTools } from '@repo/mcp-common/src/tools/account.tools'
import { registerD1Tools } from '@repo/mcp-common/src/tools/d1.tools'
import { registerDocsTools } from '@repo/mcp-common/src/tools/docs-vectorize.tools'
import { registerHyperdriveTools } from '@repo/mcp-common/src/tools/hyperdrive.tools'
import { registerKVTools } from '@repo/mcp-common/src/tools/kv_namespace.tools'
import { registerR2BucketTools } from '@repo/mcp-common/src/tools/r2_bucket.tools'
Expand Down Expand Up @@ -77,6 +79,10 @@ export class WorkersBindingsMCP extends McpAgent<Env, WorkersBindingsMCPState, P
registerR2BucketTools(this)
registerD1Tools(this)
registerHyperdriveTools(this)

// Add docs tools
registerDocsTools(this, this.env)
registerPrompts(this)
}

async getActiveAccountId() {
Expand Down
7 changes: 4 additions & 3 deletions apps/workers-bindings/src/bindings.context.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,13 +11,14 @@ export interface Env {
MCP_OBJECT: DurableObjectNamespace<WorkersBindingsMCP>
USER_DETAILS: DurableObjectNamespace<UserDetails>
MCP_METRICS: AnalyticsEngineDataset
DEV_DISABLE_OAUTH: string
DEV_CLOUDFLARE_API_TOKEN: string
DEV_CLOUDFLARE_EMAIL: string
CLOUDFLARE_API_TOKEN: string
OPENAI_API_KEY: string
AI_GATEWAY_TOKEN: string
CLOUDFLARE_ACCOUNT_ID: string
AI_GATEWAY_ID: string
AI: Ai
VECTORIZE: VectorizeIndex
DEV_DISABLE_OAUTH: string
DEV_CLOUDFLARE_API_TOKEN: string
DEV_CLOUDFLARE_EMAIL: string
}
27 changes: 27 additions & 0 deletions apps/workers-bindings/wrangler.jsonc
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,15 @@
"CLOUDFLARE_CLIENT_ID": "<PLACEHOLDER>",
"CLOUDFLARE_CLIENT_SECRET": "<PLACEHOLDER>"
},
"ai": {
"binding": "AI"
},
"vectorize": [
{
"binding": "VECTORIZE",
"index_name": "docs-bge-base"
}
],
"workers_dev": false,
"preview_urls": false,
"analytics_engine_datasets": [
Expand Down Expand Up @@ -77,6 +86,15 @@
"id": "4258ce2dee98428db6c9870eb5097f26"
}
],
"ai": {
"binding": "AI"
},
"vectorize": [
{
"binding": "VECTORIZE",
"index_name": "docs-bge-base"
}
],
"vars": {
"ENVIRONMENT": "staging",
"MCP_SERVER_NAME": "workers-bindings-staging",
Expand Down Expand Up @@ -117,6 +135,15 @@
"MCP_SERVER_NAME": "workers-bindings",
"MCP_SERVER_VERSION": "1.0.0"
},
"ai": {
"binding": "AI"
},
"vectorize": [
{
"binding": "VECTORIZE",
"index_name": "docs-bge-base"
}
],
"analytics_engine_datasets": [
{
"binding": "MCP_METRICS",
Expand Down
6 changes: 6 additions & 0 deletions apps/workers-observability/src/workers-observability.app.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,12 @@ import {
} from '@repo/mcp-common/src/cloudflare-oauth-handler'
import { getUserDetails, UserDetails } from '@repo/mcp-common/src/durable-objects/user_details.do'
import { getEnv } from '@repo/mcp-common/src/env'
import { registerPrompts } from '@repo/mcp-common/src/prompts/docs-vectorize.prompts'
import { RequiredScopes } from '@repo/mcp-common/src/scopes'
import { initSentryWithUser } from '@repo/mcp-common/src/sentry'
import { CloudflareMCPServer } from '@repo/mcp-common/src/server'
import { registerAccountTools } from '@repo/mcp-common/src/tools/account.tools'
import { registerDocsTools } from '@repo/mcp-common/src/tools/docs-vectorize.tools'
import { registerWorkersTools } from '@repo/mcp-common/src/tools/worker.tools'

import { MetricsTracker } from '../../../packages/mcp-observability/src'
Expand Down Expand Up @@ -83,6 +85,10 @@ export class ObservabilityMCP extends McpAgent<Env, State, Props> {

// Register Cloudflare Workers logs tools
registerObservabilityTools(this)

// Add docs tools
registerDocsTools(this, this.env)
registerPrompts(this)
}

async getActiveAccountId() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@ export interface Env {
SENTRY_ACCESS_CLIENT_SECRET: string
GIT_HASH: string
SENTRY_DSN: string
AI: Ai
VECTORIZE: VectorizeIndex
DEV_DISABLE_OAUTH: string
DEV_CLOUDFLARE_API_TOKEN: string
DEV_CLOUDFLARE_EMAIL: string
Expand Down
27 changes: 27 additions & 0 deletions apps/workers-observability/wrangler.jsonc
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,15 @@
"id": "DEV_KV"
}
],
"ai": {
"binding": "AI"
},
"vectorize": [
{
"binding": "VECTORIZE",
"index_name": "docs-bge-base"
}
],
"vars": {
"ENVIRONMENT": "development",
"MCP_SERVER_NAME": "PLACEHOLDER",
Expand Down Expand Up @@ -83,6 +92,15 @@
"MCP_SERVER_NAME": "workers-observability-staging",
"MCP_SERVER_VERSION": "1.0.0"
},
"ai": {
"binding": "AI"
},
"vectorize": [
{
"binding": "VECTORIZE",
"index_name": "docs-bge-base"
}
],
"analytics_engine_datasets": [
{
"binding": "MCP_METRICS",
Expand Down Expand Up @@ -112,6 +130,15 @@
"id": "753f27a19ef94d7dbd49de05588ca890"
}
],
"ai": {
"binding": "AI"
},
"vectorize": [
{
"binding": "VECTORIZE",
"index_name": "docs-bge-base"
}
],
"vars": {
"ENVIRONMENT": "production",
"GIT_HASH": "OVERRIDEN_DURING_DEPLOYMENT",
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
import type { CloudflareDocumentationMCP } from '../docs-vectorize.app'
import type { CloudflareMcpAgentNoAccount } from '../types/cloudflare-mcp-agent.types'

/**
* Registers developer-platform-related prompts with the MCP server
* @param agent The MCP server instance
*/
export function registerPrompts(agent: CloudflareDocumentationMCP) {
export function registerPrompts(agent: CloudflareMcpAgentNoAccount) {
agent.server.prompt(
'workers-prompt-full',
'Detailed prompt for generating Cloudflare Workers code (and other developer platform products) from https://developers.cloudflare.com/workers/prompt.txt',
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,11 @@
import { z } from 'zod'

import type { CloudflareDocumentationMCP } from '../docs-vectorize.app'
import type { CloudflareMcpAgentNoAccount } from '../types/cloudflare-mcp-agent.types'

interface RequiredEnv {
AI: Ai
VECTORIZE: VectorizeIndex
}

// Always return 10 results for simplicity, don't make it configurable
const TOP_K = 10
Expand All @@ -9,7 +14,7 @@ const TOP_K = 10
* Registers the docs search tool with the MCP server
* @param agent The MCP server instance
*/
export function registerDocsTools(agent: CloudflareDocumentationMCP) {
export function registerDocsTools(agent: CloudflareMcpAgentNoAccount, env: RequiredEnv) {
agent.server.tool(
'search_cloudflare_documentation',
`Search the Cloudflare documentation.
Expand All @@ -26,7 +31,7 @@ export function registerDocsTools(agent: CloudflareDocumentationMCP) {
query: z.string(),
},
async ({ query }) => {
const results = await queryVectorize(agent.env.AI, agent.env.VECTORIZE, query, TOP_K)
const results = await queryVectorize(env.AI, env.VECTORIZE, query, TOP_K)
const resultsAsXml = results
.map((result) => {
return `<result>
Expand Down
7 changes: 6 additions & 1 deletion packages/mcp-common/src/types/cloudflare-mcp-agent.types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,13 @@ type McpAgentWithoutServer<EnvType = unknown> = Omit<
'server'
>

export interface CloudflareMcpAgent<EnvType = unknown> extends McpAgentWithoutServer<EnvType> {
export interface CloudflareMcpAgentNoAccount<EnvType = unknown>
extends McpAgentWithoutServer<EnvType> {
server: CloudflareMCPServer
}

export interface CloudflareMcpAgent<EnvType = unknown>
extends CloudflareMcpAgentNoAccount<EnvType> {
setActiveAccountId(accountId: string): Promise<void>
getActiveAccountId(): Promise<string | null>
}