Skip to content

Commit f885d07

Browse files
authored
Add search docs tool to bindings and obs servers (cloudflare#187)
1 parent 9538c04 commit f885d07

File tree

11 files changed

+99
-13
lines changed

11 files changed

+99
-13
lines changed

.changeset/long-spies-peel.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
---
2+
'workers-observability': minor
3+
'workers-bindings': minor
4+
'docs-vectorize': minor
5+
'@repo/mcp-common': minor
6+
---
7+
8+
Add search docs tool to bindings and obs servers

apps/docs-vectorize/src/docs-vectorize.app.ts

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,9 @@ import { McpAgent } from 'agents/mcp'
22

33
import { createApiHandler } from '@repo/mcp-common/src/api-handler'
44
import { getEnv } from '@repo/mcp-common/src/env'
5+
import { registerPrompts } from '@repo/mcp-common/src/prompts/docs-vectorize.prompts'
56
import { CloudflareMCPServer } from '@repo/mcp-common/src/server'
6-
7-
import { registerPrompts } from './prompts/docs-vectorize.prompts'
8-
import { registerDocsTools } from './tools/docs-vectorize.tools'
7+
import { registerDocsTools } from '@repo/mcp-common/src/tools/docs-vectorize.tools'
98

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

@@ -33,7 +32,7 @@ export class CloudflareDocumentationMCP extends McpAgent<Env, State, Props> {
3332
}
3433

3534
async init() {
36-
registerDocsTools(this)
35+
registerDocsTools(this, this.env)
3736
registerPrompts(this)
3837
}
3938
}

apps/workers-bindings/src/bindings.app.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,12 @@ import {
88
} from '@repo/mcp-common/src/cloudflare-oauth-handler'
99
import { getUserDetails, UserDetails } from '@repo/mcp-common/src/durable-objects/user_details.do'
1010
import { getEnv } from '@repo/mcp-common/src/env'
11+
import { registerPrompts } from '@repo/mcp-common/src/prompts/docs-vectorize.prompts'
1112
import { RequiredScopes } from '@repo/mcp-common/src/scopes'
1213
import { CloudflareMCPServer } from '@repo/mcp-common/src/server'
1314
import { registerAccountTools } from '@repo/mcp-common/src/tools/account.tools'
1415
import { registerD1Tools } from '@repo/mcp-common/src/tools/d1.tools'
16+
import { registerDocsTools } from '@repo/mcp-common/src/tools/docs-vectorize.tools'
1517
import { registerHyperdriveTools } from '@repo/mcp-common/src/tools/hyperdrive.tools'
1618
import { registerKVTools } from '@repo/mcp-common/src/tools/kv_namespace.tools'
1719
import { registerR2BucketTools } from '@repo/mcp-common/src/tools/r2_bucket.tools'
@@ -77,6 +79,10 @@ export class WorkersBindingsMCP extends McpAgent<Env, WorkersBindingsMCPState, P
7779
registerR2BucketTools(this)
7880
registerD1Tools(this)
7981
registerHyperdriveTools(this)
82+
83+
// Add docs tools
84+
registerDocsTools(this, this.env)
85+
registerPrompts(this)
8086
}
8187

8288
async getActiveAccountId() {

apps/workers-bindings/src/bindings.context.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,14 @@ export interface Env {
1111
MCP_OBJECT: DurableObjectNamespace<WorkersBindingsMCP>
1212
USER_DETAILS: DurableObjectNamespace<UserDetails>
1313
MCP_METRICS: AnalyticsEngineDataset
14-
DEV_DISABLE_OAUTH: string
15-
DEV_CLOUDFLARE_API_TOKEN: string
16-
DEV_CLOUDFLARE_EMAIL: string
1714
CLOUDFLARE_API_TOKEN: string
1815
OPENAI_API_KEY: string
1916
AI_GATEWAY_TOKEN: string
2017
CLOUDFLARE_ACCOUNT_ID: string
2118
AI_GATEWAY_ID: string
2219
AI: Ai
20+
VECTORIZE: VectorizeIndex
21+
DEV_DISABLE_OAUTH: string
22+
DEV_CLOUDFLARE_API_TOKEN: string
23+
DEV_CLOUDFLARE_EMAIL: string
2324
}

apps/workers-bindings/wrangler.jsonc

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,15 @@
4545
"CLOUDFLARE_CLIENT_ID": "<PLACEHOLDER>",
4646
"CLOUDFLARE_CLIENT_SECRET": "<PLACEHOLDER>"
4747
},
48+
"ai": {
49+
"binding": "AI"
50+
},
51+
"vectorize": [
52+
{
53+
"binding": "VECTORIZE",
54+
"index_name": "docs-bge-base"
55+
}
56+
],
4857
"workers_dev": false,
4958
"preview_urls": false,
5059
"analytics_engine_datasets": [
@@ -77,6 +86,15 @@
7786
"id": "4258ce2dee98428db6c9870eb5097f26"
7887
}
7988
],
89+
"ai": {
90+
"binding": "AI"
91+
},
92+
"vectorize": [
93+
{
94+
"binding": "VECTORIZE",
95+
"index_name": "docs-bge-base"
96+
}
97+
],
8098
"vars": {
8199
"ENVIRONMENT": "staging",
82100
"MCP_SERVER_NAME": "workers-bindings-staging",
@@ -117,6 +135,15 @@
117135
"MCP_SERVER_NAME": "workers-bindings",
118136
"MCP_SERVER_VERSION": "1.0.0"
119137
},
138+
"ai": {
139+
"binding": "AI"
140+
},
141+
"vectorize": [
142+
{
143+
"binding": "VECTORIZE",
144+
"index_name": "docs-bge-base"
145+
}
146+
],
120147
"analytics_engine_datasets": [
121148
{
122149
"binding": "MCP_METRICS",

apps/workers-observability/src/workers-observability.app.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,12 @@ import {
88
} from '@repo/mcp-common/src/cloudflare-oauth-handler'
99
import { getUserDetails, UserDetails } from '@repo/mcp-common/src/durable-objects/user_details.do'
1010
import { getEnv } from '@repo/mcp-common/src/env'
11+
import { registerPrompts } from '@repo/mcp-common/src/prompts/docs-vectorize.prompts'
1112
import { RequiredScopes } from '@repo/mcp-common/src/scopes'
1213
import { initSentryWithUser } from '@repo/mcp-common/src/sentry'
1314
import { CloudflareMCPServer } from '@repo/mcp-common/src/server'
1415
import { registerAccountTools } from '@repo/mcp-common/src/tools/account.tools'
16+
import { registerDocsTools } from '@repo/mcp-common/src/tools/docs-vectorize.tools'
1517
import { registerWorkersTools } from '@repo/mcp-common/src/tools/worker.tools'
1618

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

8486
// Register Cloudflare Workers logs tools
8587
registerObservabilityTools(this)
88+
89+
// Add docs tools
90+
registerDocsTools(this, this.env)
91+
registerPrompts(this)
8692
}
8793

8894
async getActiveAccountId() {

apps/workers-observability/src/workers-observability.context.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ export interface Env {
1515
SENTRY_ACCESS_CLIENT_SECRET: string
1616
GIT_HASH: string
1717
SENTRY_DSN: string
18+
AI: Ai
19+
VECTORIZE: VectorizeIndex
1820
DEV_DISABLE_OAUTH: string
1921
DEV_CLOUDFLARE_API_TOKEN: string
2022
DEV_CLOUDFLARE_EMAIL: string

apps/workers-observability/wrangler.jsonc

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,15 @@
3535
"id": "DEV_KV"
3636
}
3737
],
38+
"ai": {
39+
"binding": "AI"
40+
},
41+
"vectorize": [
42+
{
43+
"binding": "VECTORIZE",
44+
"index_name": "docs-bge-base"
45+
}
46+
],
3847
"vars": {
3948
"ENVIRONMENT": "development",
4049
"MCP_SERVER_NAME": "PLACEHOLDER",
@@ -83,6 +92,15 @@
8392
"MCP_SERVER_NAME": "workers-observability-staging",
8493
"MCP_SERVER_VERSION": "1.0.0"
8594
},
95+
"ai": {
96+
"binding": "AI"
97+
},
98+
"vectorize": [
99+
{
100+
"binding": "VECTORIZE",
101+
"index_name": "docs-bge-base"
102+
}
103+
],
86104
"analytics_engine_datasets": [
87105
{
88106
"binding": "MCP_METRICS",
@@ -112,6 +130,15 @@
112130
"id": "753f27a19ef94d7dbd49de05588ca890"
113131
}
114132
],
133+
"ai": {
134+
"binding": "AI"
135+
},
136+
"vectorize": [
137+
{
138+
"binding": "VECTORIZE",
139+
"index_name": "docs-bge-base"
140+
}
141+
],
115142
"vars": {
116143
"ENVIRONMENT": "production",
117144
"GIT_HASH": "OVERRIDEN_DURING_DEPLOYMENT",

apps/docs-vectorize/src/prompts/docs-vectorize.prompts.ts renamed to packages/mcp-common/src/prompts/docs-vectorize.prompts.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
1-
import type { CloudflareDocumentationMCP } from '../docs-vectorize.app'
1+
import type { CloudflareMcpAgentNoAccount } from '../types/cloudflare-mcp-agent.types'
22

33
/**
44
* Registers developer-platform-related prompts with the MCP server
55
* @param agent The MCP server instance
66
*/
7-
export function registerPrompts(agent: CloudflareDocumentationMCP) {
7+
export function registerPrompts(agent: CloudflareMcpAgentNoAccount) {
88
agent.server.prompt(
99
'workers-prompt-full',
1010
'Detailed prompt for generating Cloudflare Workers code (and other developer platform products) from https://developers.cloudflare.com/workers/prompt.txt',

apps/docs-vectorize/src/tools/docs-vectorize.tools.ts renamed to packages/mcp-common/src/tools/docs-vectorize.tools.ts

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
import { z } from 'zod'
22

3-
import type { CloudflareDocumentationMCP } from '../docs-vectorize.app'
3+
import type { CloudflareMcpAgentNoAccount } from '../types/cloudflare-mcp-agent.types'
4+
5+
interface RequiredEnv {
6+
AI: Ai
7+
VECTORIZE: VectorizeIndex
8+
}
49

510
// Always return 10 results for simplicity, don't make it configurable
611
const TOP_K = 10
@@ -9,7 +14,7 @@ const TOP_K = 10
914
* Registers the docs search tool with the MCP server
1015
* @param agent The MCP server instance
1116
*/
12-
export function registerDocsTools(agent: CloudflareDocumentationMCP) {
17+
export function registerDocsTools(agent: CloudflareMcpAgentNoAccount, env: RequiredEnv) {
1318
agent.server.tool(
1419
'search_cloudflare_documentation',
1520
`Search the Cloudflare documentation.
@@ -26,7 +31,7 @@ export function registerDocsTools(agent: CloudflareDocumentationMCP) {
2631
query: z.string(),
2732
},
2833
async ({ query }) => {
29-
const results = await queryVectorize(agent.env.AI, agent.env.VECTORIZE, query, TOP_K)
34+
const results = await queryVectorize(env.AI, env.VECTORIZE, query, TOP_K)
3035
const resultsAsXml = results
3136
.map((result) => {
3237
return `<result>

0 commit comments

Comments
 (0)