Merge pull request #10 from modelcontextprotocol/e2e-testing
E2E testing
This commit is contained in:
parent
6a3130a075
commit
ace3220fca
13 changed files with 11726 additions and 17 deletions
|
|
@ -17,8 +17,7 @@
|
|||
"react": "^19.0.0",
|
||||
"react-dom": "^19.0.0",
|
||||
"react-router-dom": "^7.6.2",
|
||||
"tailwindcss": "^4.0.14",
|
||||
"use-mcp": "link:../.."
|
||||
"tailwindcss": "^4.0.14"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@cloudflare/vite-plugin": "^1.5.0",
|
||||
|
|
@ -34,6 +33,7 @@
|
|||
"prettier": "^3.5.3",
|
||||
"typescript": "~5.7.2",
|
||||
"typescript-eslint": "^8.24.1",
|
||||
"use-mcp": "link:../..",
|
||||
"vite": "^6.2.0",
|
||||
"wrangler": "^4.19.1"
|
||||
},
|
||||
|
|
|
|||
6
examples/inspector/pnpm-lock.yaml
generated
6
examples/inspector/pnpm-lock.yaml
generated
|
|
@ -26,9 +26,6 @@ importers:
|
|||
tailwindcss:
|
||||
specifier: ^4.0.14
|
||||
version: 4.1.6
|
||||
use-mcp:
|
||||
specifier: link:../..
|
||||
version: link:../..
|
||||
devDependencies:
|
||||
'@cloudflare/vite-plugin':
|
||||
specifier: ^1.5.0
|
||||
|
|
@ -69,6 +66,9 @@ importers:
|
|||
typescript-eslint:
|
||||
specifier: ^8.24.1
|
||||
version: 8.32.0(eslint@9.26.0(jiti@2.4.2))(typescript@5.7.3)
|
||||
use-mcp:
|
||||
specifier: link:../..
|
||||
version: link:../..
|
||||
vite:
|
||||
specifier: ^6.2.0
|
||||
version: 6.3.5(jiti@2.4.2)(lightningcss@1.29.2)
|
||||
|
|
|
|||
|
|
@ -10,7 +10,7 @@ function McpConnection({ serverUrl, onConnectionUpdate }: { serverUrl: string; o
|
|||
debug: true,
|
||||
autoRetry: false,
|
||||
popupFeatures: 'width=500,height=600,resizable=yes,scrollbars=yes',
|
||||
transportType: 'auto'
|
||||
transportType: 'auto',
|
||||
})
|
||||
|
||||
// Update parent component with connection data
|
||||
|
|
|
|||
|
|
@ -5,4 +5,8 @@ import tailwindcss from '@tailwindcss/vite'
|
|||
// https://vite.dev/config/
|
||||
export default defineConfig({
|
||||
plugins: [react(), tailwindcss()],
|
||||
build: {
|
||||
// @ts-ignore
|
||||
minify: !process.env.NO_MINIFY,
|
||||
},
|
||||
})
|
||||
|
|
|
|||
33
examples/servers/hono-mcp/.gitignore
vendored
Normal file
33
examples/servers/hono-mcp/.gitignore
vendored
Normal file
|
|
@ -0,0 +1,33 @@
|
|||
# prod
|
||||
dist/
|
||||
|
||||
# dev
|
||||
.yarn/
|
||||
!.yarn/releases
|
||||
.vscode/*
|
||||
!.vscode/launch.json
|
||||
!.vscode/*.code-snippets
|
||||
.idea/workspace.xml
|
||||
.idea/usage.statistics.xml
|
||||
.idea/shelf
|
||||
|
||||
# deps
|
||||
node_modules/
|
||||
.wrangler
|
||||
|
||||
# env
|
||||
.env
|
||||
.env.production
|
||||
.dev.vars
|
||||
|
||||
# logs
|
||||
logs/
|
||||
*.log
|
||||
npm-debug.log*
|
||||
yarn-debug.log*
|
||||
yarn-error.log*
|
||||
pnpm-debug.log*
|
||||
lerna-debug.log*
|
||||
|
||||
# misc
|
||||
.DS_Store
|
||||
21
examples/servers/hono-mcp/README.md
Normal file
21
examples/servers/hono-mcp/README.md
Normal file
|
|
@ -0,0 +1,21 @@
|
|||
```txt
|
||||
npm install
|
||||
npm run dev
|
||||
```
|
||||
|
||||
```txt
|
||||
npm run deploy
|
||||
```
|
||||
|
||||
[For generating/synchronizing types based on your Worker configuration run](https://developers.cloudflare.com/workers/wrangler/commands/#types):
|
||||
|
||||
```txt
|
||||
npm run cf-typegen
|
||||
```
|
||||
|
||||
Pass the `CloudflareBindings` as generics when instantiation `Hono`:
|
||||
|
||||
```ts
|
||||
// src/index.ts
|
||||
const app = new Hono<{ Bindings: CloudflareBindings }>()
|
||||
```
|
||||
17
examples/servers/hono-mcp/package.json
Normal file
17
examples/servers/hono-mcp/package.json
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
{
|
||||
"name": "vengabus",
|
||||
"scripts": {
|
||||
"dev": "wrangler dev",
|
||||
"deploy": "wrangler deploy --minify",
|
||||
"cf-typegen": "wrangler types --env-interface CloudflareBindings"
|
||||
},
|
||||
"dependencies": {
|
||||
"hono": "^4.8.2"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@hono/mcp": "^0.1.0",
|
||||
"@modelcontextprotocol/sdk": "^1.13.1",
|
||||
"wrangler": "^4.21.0",
|
||||
"zod": "^3.25.67"
|
||||
}
|
||||
}
|
||||
1639
examples/servers/hono-mcp/pnpm-lock.yaml
generated
Normal file
1639
examples/servers/hono-mcp/pnpm-lock.yaml
generated
Normal file
File diff suppressed because it is too large
Load diff
0
examples/servers/hono-mcp/public/.gitkeep
Normal file
0
examples/servers/hono-mcp/public/.gitkeep
Normal file
63
examples/servers/hono-mcp/src/index.ts
Normal file
63
examples/servers/hono-mcp/src/index.ts
Normal file
|
|
@ -0,0 +1,63 @@
|
|||
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'
|
||||
import { StreamableHTTPTransport } from '@hono/mcp'
|
||||
import { Hono } from 'hono'
|
||||
import { z } from 'zod'
|
||||
import { cors } from 'hono/cors'
|
||||
|
||||
const app = new Hono()
|
||||
|
||||
app.use(
|
||||
'/*',
|
||||
cors({
|
||||
origin: '*',
|
||||
allowHeaders: ['content-type', 'mcp-session-id', 'mcp-protocol-version'],
|
||||
exposeHeaders: ['mcp-session-id'],
|
||||
}),
|
||||
)
|
||||
|
||||
// Your MCP server implementation
|
||||
const mcpServer = new McpServer({
|
||||
name: 'my-mcp-server',
|
||||
version: '1.0.0',
|
||||
})
|
||||
|
||||
mcpServer.registerTool(
|
||||
'add',
|
||||
{
|
||||
title: 'Addition Tool',
|
||||
description: 'Add two numbers',
|
||||
inputSchema: { a: z.number(), b: z.number() },
|
||||
},
|
||||
async ({ a, b }) => ({
|
||||
content: [{ type: 'text', text: String(a + b) }],
|
||||
}),
|
||||
)
|
||||
|
||||
mcpServer.registerTool(
|
||||
'get_vengabus_times',
|
||||
{
|
||||
title: 'Vengabus Schedule Checker',
|
||||
description:
|
||||
"This checks to see when the next Vengabus is, or whether there is one for the user's current location. Please display all the information to the user in a tabulated form.",
|
||||
inputSchema: {},
|
||||
},
|
||||
async () => {
|
||||
await scheduler.wait(100 + Math.random() * 100)
|
||||
return {
|
||||
content: [
|
||||
{
|
||||
type: 'text',
|
||||
text: `Next Vengabus: imminent. Current user's route: New York to San Francisco. Route name: "Intercity Disco".`,
|
||||
},
|
||||
],
|
||||
}
|
||||
},
|
||||
)
|
||||
|
||||
app.post('/mcp', async (c) => {
|
||||
const transport = new StreamableHTTPTransport()
|
||||
await mcpServer.connect(transport)
|
||||
return transport.handleRequest(c)
|
||||
})
|
||||
|
||||
export default app
|
||||
13
examples/servers/hono-mcp/tsconfig.json
Normal file
13
examples/servers/hono-mcp/tsconfig.json
Normal file
|
|
@ -0,0 +1,13 @@
|
|||
{
|
||||
"compilerOptions": {
|
||||
"target": "ESNext",
|
||||
"module": "ESNext",
|
||||
"moduleResolution": "Bundler",
|
||||
"strict": true,
|
||||
"skipLibCheck": true,
|
||||
"lib": ["ESNext"],
|
||||
"jsx": "react-jsx",
|
||||
"jsxImportSource": "hono/jsx",
|
||||
"types": ["./worker-configuration.d.ts"]
|
||||
}
|
||||
}
|
||||
7946
examples/servers/hono-mcp/worker-configuration.d.ts
vendored
Normal file
7946
examples/servers/hono-mcp/worker-configuration.d.ts
vendored
Normal file
File diff suppressed because it is too large
Load diff
51
examples/servers/hono-mcp/wrangler.jsonc
Normal file
51
examples/servers/hono-mcp/wrangler.jsonc
Normal file
|
|
@ -0,0 +1,51 @@
|
|||
/**
|
||||
* For more details on how to configure Wrangler, refer to:
|
||||
* https://developers.cloudflare.com/workers/wrangler/configuration/
|
||||
*/
|
||||
{
|
||||
"$schema": "node_modules/wrangler/config-schema.json",
|
||||
"name": "vengabus",
|
||||
"main": "src/index.ts",
|
||||
"compatibility_date": "2025-06-20",
|
||||
"assets": {
|
||||
"binding": "ASSETS",
|
||||
"directory": "./public"
|
||||
},
|
||||
"observability": {
|
||||
"enabled": true
|
||||
}
|
||||
/**
|
||||
* Smart Placement
|
||||
* Docs: https://developers.cloudflare.com/workers/configuration/smart-placement/#smart-placement
|
||||
*/
|
||||
// "placement": { "mode": "smart" },
|
||||
|
||||
/**
|
||||
* Bindings
|
||||
* Bindings allow your Worker to interact with resources on the Cloudflare Developer Platform, including
|
||||
* databases, object storage, AI inference, real-time communication and more.
|
||||
* https://developers.cloudflare.com/workers/runtime-apis/bindings/
|
||||
*/
|
||||
|
||||
/**
|
||||
* Environment Variables
|
||||
* https://developers.cloudflare.com/workers/wrangler/configuration/#environment-variables
|
||||
*/
|
||||
// "vars": { "MY_VARIABLE": "production_value" },
|
||||
/**
|
||||
* Note: Use secrets to store sensitive data.
|
||||
* https://developers.cloudflare.com/workers/configuration/secrets/
|
||||
*/
|
||||
|
||||
/**
|
||||
* Static Assets
|
||||
* https://developers.cloudflare.com/workers/static-assets/binding/
|
||||
*/
|
||||
// "assets": { "directory": "./public/", "binding": "ASSETS" },
|
||||
|
||||
/**
|
||||
* Service Bindings (communicate between multiple Workers)
|
||||
* https://developers.cloudflare.com/workers/wrangler/configuration/#service-bindings
|
||||
*/
|
||||
// "services": [{ "binding": "MY_SERVICE", "service": "my-service" }]
|
||||
}
|
||||
Loading…
Reference in a new issue