aidevops 2.52.1 → 2.53.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/VERSION +1 -1
- package/aidevops.sh +15 -9
- package/package.json +4 -4
- package/scripts/npm-postinstall.js +6 -7
- package/setup.sh +1 -1
- package/templates/deploy-templates.sh +144 -0
- package/templates/home/.agent/README.md +33 -0
- package/templates/home/AGENTS.md +96 -0
- package/templates/home/git/.agent/README.md +48 -0
- package/templates/home/git/AGENTS.md +97 -0
- package/templates/standard-functions.sh +179 -0
- package/templates/wordpress-performance-workflow.md +217 -0
- package/.agent/AGENTS.md +0 -614
- package/.agent/accounts.md +0 -65
- package/.agent/aidevops/add-new-mcp-to-aidevops.md +0 -456
- package/.agent/aidevops/api-integrations.md +0 -335
- package/.agent/aidevops/architecture.md +0 -510
- package/.agent/aidevops/configs.md +0 -274
- package/.agent/aidevops/docs.md +0 -244
- package/.agent/aidevops/extension.md +0 -311
- package/.agent/aidevops/mcp-integrations.md +0 -340
- package/.agent/aidevops/mcp-troubleshooting.md +0 -162
- package/.agent/aidevops/memory-patterns.md +0 -172
- package/.agent/aidevops/providers.md +0 -217
- package/.agent/aidevops/recommendations.md +0 -321
- package/.agent/aidevops/requirements.md +0 -301
- package/.agent/aidevops/resources.md +0 -214
- package/.agent/aidevops/security-requirements.md +0 -174
- package/.agent/aidevops/security.md +0 -350
- package/.agent/aidevops/service-links.md +0 -400
- package/.agent/aidevops/services.md +0 -357
- package/.agent/aidevops/setup.md +0 -153
- package/.agent/aidevops/troubleshooting.md +0 -389
- package/.agent/aidevops.md +0 -124
- package/.agent/build-plus.md +0 -244
- package/.agent/content/guidelines.md +0 -109
- package/.agent/content.md +0 -87
- package/.agent/health.md +0 -59
- package/.agent/legal.md +0 -59
- package/.agent/loop-state/full-loop.local.md +0 -16
- package/.agent/loop-state/ralph-loop.local.md +0 -10
- package/.agent/marketing.md +0 -440
- package/.agent/memory/README.md +0 -260
- package/.agent/onboarding.md +0 -796
- package/.agent/plan-plus.md +0 -245
- package/.agent/research.md +0 -100
- package/.agent/sales.md +0 -333
- package/.agent/scripts/101domains-helper.sh +0 -701
- package/.agent/scripts/add-missing-returns.sh +0 -140
- package/.agent/scripts/agent-browser-helper.sh +0 -311
- package/.agent/scripts/agno-setup.sh +0 -712
- package/.agent/scripts/ahrefs-mcp-wrapper.js +0 -168
- package/.agent/scripts/aidevops-update-check.sh +0 -71
- package/.agent/scripts/ampcode-cli.sh +0 -522
- package/.agent/scripts/auto-version-bump.sh +0 -156
- package/.agent/scripts/autogen-helper.sh +0 -512
- package/.agent/scripts/beads-sync-helper.sh +0 -596
- package/.agent/scripts/closte-helper.sh +0 -5
- package/.agent/scripts/cloudron-helper.sh +0 -321
- package/.agent/scripts/codacy-cli-chunked.sh +0 -581
- package/.agent/scripts/codacy-cli.sh +0 -442
- package/.agent/scripts/code-audit-helper.sh +0 -5
- package/.agent/scripts/coderabbit-cli.sh +0 -417
- package/.agent/scripts/coderabbit-pro-analysis.sh +0 -238
- package/.agent/scripts/commands/code-simplifier.md +0 -86
- package/.agent/scripts/commands/full-loop.md +0 -246
- package/.agent/scripts/commands/postflight-loop.md +0 -103
- package/.agent/scripts/commands/recall.md +0 -182
- package/.agent/scripts/commands/remember.md +0 -132
- package/.agent/scripts/commands/save-todo.md +0 -175
- package/.agent/scripts/commands/session-review.md +0 -154
- package/.agent/scripts/comprehensive-quality-fix.sh +0 -106
- package/.agent/scripts/context-builder-helper.sh +0 -522
- package/.agent/scripts/coolify-cli-helper.sh +0 -674
- package/.agent/scripts/coolify-helper.sh +0 -380
- package/.agent/scripts/crawl4ai-examples.sh +0 -401
- package/.agent/scripts/crawl4ai-helper.sh +0 -1078
- package/.agent/scripts/crewai-helper.sh +0 -681
- package/.agent/scripts/dev-browser-helper.sh +0 -513
- package/.agent/scripts/dns-helper.sh +0 -396
- package/.agent/scripts/domain-research-helper.sh +0 -917
- package/.agent/scripts/dspy-helper.sh +0 -285
- package/.agent/scripts/dspyground-helper.sh +0 -291
- package/.agent/scripts/eeat-score-helper.sh +0 -1242
- package/.agent/scripts/efficient-return-fix.sh +0 -92
- package/.agent/scripts/extract-opencode-prompts.sh +0 -128
- package/.agent/scripts/find-missing-returns.sh +0 -113
- package/.agent/scripts/fix-auth-headers.sh +0 -104
- package/.agent/scripts/fix-common-strings.sh +0 -254
- package/.agent/scripts/fix-content-type.sh +0 -100
- package/.agent/scripts/fix-error-messages.sh +0 -130
- package/.agent/scripts/fix-misplaced-returns.sh +0 -74
- package/.agent/scripts/fix-remaining-literals.sh +0 -152
- package/.agent/scripts/fix-return-statements.sh +0 -41
- package/.agent/scripts/fix-s131-default-cases.sh +0 -249
- package/.agent/scripts/fix-sc2155-simple.sh +0 -102
- package/.agent/scripts/fix-shellcheck-critical.sh +0 -187
- package/.agent/scripts/fix-string-literals.sh +0 -273
- package/.agent/scripts/full-loop-helper.sh +0 -773
- package/.agent/scripts/generate-opencode-agents.sh +0 -497
- package/.agent/scripts/generate-opencode-commands.sh +0 -1629
- package/.agent/scripts/generate-skills.sh +0 -366
- package/.agent/scripts/git-platforms-helper.sh +0 -640
- package/.agent/scripts/gitea-cli-helper.sh +0 -743
- package/.agent/scripts/github-cli-helper.sh +0 -702
- package/.agent/scripts/gitlab-cli-helper.sh +0 -682
- package/.agent/scripts/gsc-add-user-helper.sh +0 -325
- package/.agent/scripts/gsc-sitemap-helper.sh +0 -678
- package/.agent/scripts/hetzner-helper.sh +0 -485
- package/.agent/scripts/hostinger-helper.sh +0 -229
- package/.agent/scripts/keyword-research-helper.sh +0 -1815
- package/.agent/scripts/langflow-helper.sh +0 -544
- package/.agent/scripts/linkedin-automation.py +0 -241
- package/.agent/scripts/linter-manager.sh +0 -599
- package/.agent/scripts/linters-local.sh +0 -434
- package/.agent/scripts/list-keys-helper.sh +0 -488
- package/.agent/scripts/local-browser-automation.py +0 -339
- package/.agent/scripts/localhost-helper.sh +0 -744
- package/.agent/scripts/loop-common.sh +0 -806
- package/.agent/scripts/mainwp-helper.sh +0 -728
- package/.agent/scripts/markdown-formatter.sh +0 -338
- package/.agent/scripts/markdown-lint-fix.sh +0 -311
- package/.agent/scripts/mass-fix-returns.sh +0 -58
- package/.agent/scripts/mcp-diagnose.sh +0 -167
- package/.agent/scripts/mcp-inspector-helper.sh +0 -449
- package/.agent/scripts/memory-helper.sh +0 -650
- package/.agent/scripts/monitor-code-review.sh +0 -255
- package/.agent/scripts/onboarding-helper.sh +0 -706
- package/.agent/scripts/opencode-github-setup-helper.sh +0 -797
- package/.agent/scripts/opencode-test-helper.sh +0 -213
- package/.agent/scripts/pagespeed-helper.sh +0 -464
- package/.agent/scripts/pandoc-helper.sh +0 -362
- package/.agent/scripts/postflight-check.sh +0 -555
- package/.agent/scripts/pre-commit-hook.sh +0 -259
- package/.agent/scripts/pre-edit-check.sh +0 -169
- package/.agent/scripts/qlty-cli.sh +0 -356
- package/.agent/scripts/quality-cli-manager.sh +0 -525
- package/.agent/scripts/quality-feedback-helper.sh +0 -462
- package/.agent/scripts/quality-fix.sh +0 -263
- package/.agent/scripts/quality-loop-helper.sh +0 -1108
- package/.agent/scripts/ralph-loop-helper.sh +0 -836
- package/.agent/scripts/ralph-upstream-check.sh +0 -341
- package/.agent/scripts/secretlint-helper.sh +0 -847
- package/.agent/scripts/servers-helper.sh +0 -241
- package/.agent/scripts/ses-helper.sh +0 -619
- package/.agent/scripts/session-review-helper.sh +0 -404
- package/.agent/scripts/setup-linters-wizard.sh +0 -379
- package/.agent/scripts/setup-local-api-keys.sh +0 -330
- package/.agent/scripts/setup-mcp-integrations.sh +0 -472
- package/.agent/scripts/shared-constants.sh +0 -246
- package/.agent/scripts/site-crawler-helper.sh +0 -1487
- package/.agent/scripts/snyk-helper.sh +0 -940
- package/.agent/scripts/sonarcloud-autofix.sh +0 -193
- package/.agent/scripts/sonarcloud-cli.sh +0 -191
- package/.agent/scripts/sonarscanner-cli.sh +0 -455
- package/.agent/scripts/spaceship-helper.sh +0 -747
- package/.agent/scripts/stagehand-helper.sh +0 -321
- package/.agent/scripts/stagehand-python-helper.sh +0 -321
- package/.agent/scripts/stagehand-python-setup.sh +0 -441
- package/.agent/scripts/stagehand-setup.sh +0 -439
- package/.agent/scripts/system-cleanup.sh +0 -340
- package/.agent/scripts/terminal-title-helper.sh +0 -388
- package/.agent/scripts/terminal-title-setup.sh +0 -549
- package/.agent/scripts/test-stagehand-both-integration.sh +0 -317
- package/.agent/scripts/test-stagehand-integration.sh +0 -309
- package/.agent/scripts/test-stagehand-python-integration.sh +0 -341
- package/.agent/scripts/todo-ready.sh +0 -263
- package/.agent/scripts/tool-version-check.sh +0 -362
- package/.agent/scripts/toon-helper.sh +0 -469
- package/.agent/scripts/twilio-helper.sh +0 -917
- package/.agent/scripts/updown-helper.sh +0 -279
- package/.agent/scripts/validate-mcp-integrations.sh +0 -250
- package/.agent/scripts/validate-version-consistency.sh +0 -131
- package/.agent/scripts/vaultwarden-helper.sh +0 -597
- package/.agent/scripts/vercel-cli-helper.sh +0 -816
- package/.agent/scripts/verify-mirrors.sh +0 -169
- package/.agent/scripts/version-manager.sh +0 -831
- package/.agent/scripts/webhosting-helper.sh +0 -471
- package/.agent/scripts/webhosting-verify.sh +0 -238
- package/.agent/scripts/wordpress-mcp-helper.sh +0 -508
- package/.agent/scripts/worktree-helper.sh +0 -595
- package/.agent/scripts/worktree-sessions.sh +0 -577
- package/.agent/seo/dataforseo.md +0 -215
- package/.agent/seo/domain-research.md +0 -532
- package/.agent/seo/eeat-score.md +0 -659
- package/.agent/seo/google-search-console.md +0 -366
- package/.agent/seo/gsc-sitemaps.md +0 -282
- package/.agent/seo/keyword-research.md +0 -521
- package/.agent/seo/serper.md +0 -278
- package/.agent/seo/site-crawler.md +0 -387
- package/.agent/seo.md +0 -236
- package/.agent/services/accounting/quickfile.md +0 -159
- package/.agent/services/communications/telfon.md +0 -470
- package/.agent/services/communications/twilio.md +0 -569
- package/.agent/services/crm/fluentcrm.md +0 -449
- package/.agent/services/email/ses.md +0 -399
- package/.agent/services/hosting/101domains.md +0 -378
- package/.agent/services/hosting/closte.md +0 -177
- package/.agent/services/hosting/cloudflare.md +0 -251
- package/.agent/services/hosting/cloudron.md +0 -478
- package/.agent/services/hosting/dns-providers.md +0 -335
- package/.agent/services/hosting/domain-purchasing.md +0 -344
- package/.agent/services/hosting/hetzner.md +0 -327
- package/.agent/services/hosting/hostinger.md +0 -287
- package/.agent/services/hosting/localhost.md +0 -419
- package/.agent/services/hosting/spaceship.md +0 -353
- package/.agent/services/hosting/webhosting.md +0 -330
- package/.agent/social-media.md +0 -69
- package/.agent/templates/plans-template.md +0 -114
- package/.agent/templates/prd-template.md +0 -129
- package/.agent/templates/tasks-template.md +0 -108
- package/.agent/templates/todo-template.md +0 -89
- package/.agent/tools/ai-assistants/agno.md +0 -471
- package/.agent/tools/ai-assistants/capsolver.md +0 -326
- package/.agent/tools/ai-assistants/configuration.md +0 -221
- package/.agent/tools/ai-assistants/overview.md +0 -209
- package/.agent/tools/ai-assistants/status.md +0 -171
- package/.agent/tools/ai-assistants/windsurf.md +0 -193
- package/.agent/tools/ai-orchestration/autogen.md +0 -406
- package/.agent/tools/ai-orchestration/crewai.md +0 -445
- package/.agent/tools/ai-orchestration/langflow.md +0 -405
- package/.agent/tools/ai-orchestration/openprose.md +0 -487
- package/.agent/tools/ai-orchestration/overview.md +0 -362
- package/.agent/tools/ai-orchestration/packaging.md +0 -647
- package/.agent/tools/browser/agent-browser.md +0 -464
- package/.agent/tools/browser/browser-automation.md +0 -400
- package/.agent/tools/browser/chrome-devtools.md +0 -282
- package/.agent/tools/browser/crawl4ai-integration.md +0 -422
- package/.agent/tools/browser/crawl4ai-resources.md +0 -277
- package/.agent/tools/browser/crawl4ai-usage.md +0 -416
- package/.agent/tools/browser/crawl4ai.md +0 -585
- package/.agent/tools/browser/dev-browser.md +0 -341
- package/.agent/tools/browser/pagespeed.md +0 -260
- package/.agent/tools/browser/playwright.md +0 -266
- package/.agent/tools/browser/playwriter.md +0 -310
- package/.agent/tools/browser/stagehand-examples.md +0 -456
- package/.agent/tools/browser/stagehand-python.md +0 -483
- package/.agent/tools/browser/stagehand.md +0 -421
- package/.agent/tools/build-agent/agent-review.md +0 -224
- package/.agent/tools/build-agent/build-agent.md +0 -784
- package/.agent/tools/build-mcp/aidevops-plugin.md +0 -476
- package/.agent/tools/build-mcp/api-wrapper.md +0 -445
- package/.agent/tools/build-mcp/build-mcp.md +0 -240
- package/.agent/tools/build-mcp/deployment.md +0 -401
- package/.agent/tools/build-mcp/server-patterns.md +0 -632
- package/.agent/tools/build-mcp/transports.md +0 -366
- package/.agent/tools/code-review/auditing.md +0 -383
- package/.agent/tools/code-review/automation.md +0 -219
- package/.agent/tools/code-review/best-practices.md +0 -203
- package/.agent/tools/code-review/codacy.md +0 -151
- package/.agent/tools/code-review/code-simplifier.md +0 -174
- package/.agent/tools/code-review/code-standards.md +0 -309
- package/.agent/tools/code-review/coderabbit.md +0 -101
- package/.agent/tools/code-review/management.md +0 -155
- package/.agent/tools/code-review/qlty.md +0 -248
- package/.agent/tools/code-review/secretlint.md +0 -565
- package/.agent/tools/code-review/setup.md +0 -250
- package/.agent/tools/code-review/snyk.md +0 -563
- package/.agent/tools/code-review/tools.md +0 -230
- package/.agent/tools/content/summarize.md +0 -353
- package/.agent/tools/context/augment-context-engine.md +0 -468
- package/.agent/tools/context/context-builder-agent.md +0 -76
- package/.agent/tools/context/context-builder.md +0 -375
- package/.agent/tools/context/context7.md +0 -371
- package/.agent/tools/context/dspy.md +0 -302
- package/.agent/tools/context/dspyground.md +0 -374
- package/.agent/tools/context/llm-tldr.md +0 -219
- package/.agent/tools/context/osgrep.md +0 -488
- package/.agent/tools/context/prompt-optimization.md +0 -338
- package/.agent/tools/context/toon.md +0 -292
- package/.agent/tools/conversion/pandoc.md +0 -304
- package/.agent/tools/credentials/api-key-management.md +0 -154
- package/.agent/tools/credentials/api-key-setup.md +0 -224
- package/.agent/tools/credentials/environment-variables.md +0 -180
- package/.agent/tools/credentials/vaultwarden.md +0 -382
- package/.agent/tools/data-extraction/outscraper.md +0 -974
- package/.agent/tools/deployment/coolify-cli.md +0 -388
- package/.agent/tools/deployment/coolify-setup.md +0 -353
- package/.agent/tools/deployment/coolify.md +0 -345
- package/.agent/tools/deployment/vercel.md +0 -390
- package/.agent/tools/git/authentication.md +0 -132
- package/.agent/tools/git/gitea-cli.md +0 -193
- package/.agent/tools/git/github-actions.md +0 -207
- package/.agent/tools/git/github-cli.md +0 -223
- package/.agent/tools/git/gitlab-cli.md +0 -190
- package/.agent/tools/git/opencode-github-security.md +0 -350
- package/.agent/tools/git/opencode-github.md +0 -328
- package/.agent/tools/git/opencode-gitlab.md +0 -252
- package/.agent/tools/git/security.md +0 -196
- package/.agent/tools/git.md +0 -207
- package/.agent/tools/opencode/oh-my-opencode.md +0 -375
- package/.agent/tools/opencode/opencode-anthropic-auth.md +0 -446
- package/.agent/tools/opencode/opencode.md +0 -651
- package/.agent/tools/social-media/bird.md +0 -437
- package/.agent/tools/task-management/beads.md +0 -336
- package/.agent/tools/terminal/terminal-title.md +0 -251
- package/.agent/tools/ui/shadcn.md +0 -196
- package/.agent/tools/ui/ui-skills.md +0 -115
- package/.agent/tools/wordpress/localwp.md +0 -311
- package/.agent/tools/wordpress/mainwp.md +0 -391
- package/.agent/tools/wordpress/scf.md +0 -527
- package/.agent/tools/wordpress/wp-admin.md +0 -729
- package/.agent/tools/wordpress/wp-dev.md +0 -940
- package/.agent/tools/wordpress/wp-preferred.md +0 -398
- package/.agent/tools/wordpress.md +0 -95
- package/.agent/workflows/branch/bugfix.md +0 -63
- package/.agent/workflows/branch/chore.md +0 -95
- package/.agent/workflows/branch/experiment.md +0 -115
- package/.agent/workflows/branch/feature.md +0 -59
- package/.agent/workflows/branch/hotfix.md +0 -98
- package/.agent/workflows/branch/refactor.md +0 -92
- package/.agent/workflows/branch/release.md +0 -96
- package/.agent/workflows/branch.md +0 -347
- package/.agent/workflows/bug-fixing.md +0 -267
- package/.agent/workflows/changelog.md +0 -129
- package/.agent/workflows/code-audit-remote.md +0 -279
- package/.agent/workflows/conversation-starter.md +0 -69
- package/.agent/workflows/error-feedback.md +0 -578
- package/.agent/workflows/feature-development.md +0 -355
- package/.agent/workflows/git-workflow.md +0 -702
- package/.agent/workflows/multi-repo-workspace.md +0 -268
- package/.agent/workflows/plans.md +0 -709
- package/.agent/workflows/postflight.md +0 -604
- package/.agent/workflows/pr.md +0 -571
- package/.agent/workflows/preflight.md +0 -278
- package/.agent/workflows/ralph-loop.md +0 -773
- package/.agent/workflows/release.md +0 -498
- package/.agent/workflows/session-manager.md +0 -254
- package/.agent/workflows/session-review.md +0 -311
- package/.agent/workflows/sql-migrations.md +0 -631
- package/.agent/workflows/version-bump.md +0 -283
- package/.agent/workflows/wiki-update.md +0 -333
- package/.agent/workflows/worktree.md +0 -477
|
@@ -1,445 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
description: API wrapper pattern for REST API to MCP conversion
|
|
3
|
-
mode: subagent
|
|
4
|
-
tools:
|
|
5
|
-
read: true
|
|
6
|
-
write: true
|
|
7
|
-
edit: true
|
|
8
|
-
bash: true
|
|
9
|
-
glob: true
|
|
10
|
-
grep: true
|
|
11
|
-
webfetch: true
|
|
12
|
-
---
|
|
13
|
-
|
|
14
|
-
# API Wrapper Pattern - REST API to MCP
|
|
15
|
-
|
|
16
|
-
<!-- AI-CONTEXT-START -->
|
|
17
|
-
|
|
18
|
-
## Quick Reference
|
|
19
|
-
|
|
20
|
-
- **Purpose**: Template for wrapping any REST API as an MCP server
|
|
21
|
-
- **Stack**: TypeScript + Bun + ElysiaJS + elysia-mcp
|
|
22
|
-
- **Pattern**: One tool per API endpoint
|
|
23
|
-
|
|
24
|
-
**Steps**:
|
|
25
|
-
|
|
26
|
-
1. Identify API endpoints to expose
|
|
27
|
-
2. Create Zod schemas for inputs
|
|
28
|
-
3. Map HTTP methods to tools
|
|
29
|
-
4. Handle authentication via env vars
|
|
30
|
-
5. Return structured JSON responses
|
|
31
|
-
|
|
32
|
-
<!-- AI-CONTEXT-END -->
|
|
33
|
-
|
|
34
|
-
## Complete Template
|
|
35
|
-
|
|
36
|
-
```typescript
|
|
37
|
-
import { Elysia } from 'elysia';
|
|
38
|
-
import { mcp } from 'elysia-mcp';
|
|
39
|
-
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
40
|
-
import { z } from 'zod';
|
|
41
|
-
|
|
42
|
-
// Configuration
|
|
43
|
-
const API_BASE = process.env.API_BASE_URL || 'https://api.example.com';
|
|
44
|
-
const API_KEY = process.env.API_KEY;
|
|
45
|
-
|
|
46
|
-
if (!API_KEY) {
|
|
47
|
-
console.error('API_KEY environment variable is required');
|
|
48
|
-
process.exit(1);
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
// Helper for API requests
|
|
52
|
-
async function apiRequest(
|
|
53
|
-
endpoint: string,
|
|
54
|
-
method: 'GET' | 'POST' | 'PUT' | 'DELETE' = 'GET',
|
|
55
|
-
body?: unknown
|
|
56
|
-
) {
|
|
57
|
-
const response = await fetch(`${API_BASE}${endpoint}`, {
|
|
58
|
-
method,
|
|
59
|
-
headers: {
|
|
60
|
-
'Authorization': `Bearer ${API_KEY}`,
|
|
61
|
-
'Content-Type': 'application/json',
|
|
62
|
-
},
|
|
63
|
-
body: body ? JSON.stringify(body) : undefined,
|
|
64
|
-
});
|
|
65
|
-
|
|
66
|
-
if (!response.ok) {
|
|
67
|
-
const error = await response.text();
|
|
68
|
-
throw new Error(`API Error ${response.status}: ${error}`);
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
return response.json();
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
// MCP Server
|
|
75
|
-
const app = new Elysia()
|
|
76
|
-
.use(
|
|
77
|
-
mcp({
|
|
78
|
-
serverInfo: {
|
|
79
|
-
name: 'example-api-mcp',
|
|
80
|
-
version: '1.0.0',
|
|
81
|
-
},
|
|
82
|
-
capabilities: {
|
|
83
|
-
tools: {},
|
|
84
|
-
resources: {},
|
|
85
|
-
},
|
|
86
|
-
setupServer: async (server: McpServer) => {
|
|
87
|
-
// LIST endpoint
|
|
88
|
-
server.tool(
|
|
89
|
-
'list_items',
|
|
90
|
-
{
|
|
91
|
-
page: z.number().optional().default(1).describe('Page number'),
|
|
92
|
-
limit: z.number().optional().default(20).describe('Items per page'),
|
|
93
|
-
filter: z.string().optional().describe('Filter query'),
|
|
94
|
-
},
|
|
95
|
-
async (args) => {
|
|
96
|
-
try {
|
|
97
|
-
const params = new URLSearchParams({
|
|
98
|
-
page: String(args.page),
|
|
99
|
-
limit: String(args.limit),
|
|
100
|
-
...(args.filter && { filter: args.filter }),
|
|
101
|
-
});
|
|
102
|
-
const data = await apiRequest(`/items?${params}`);
|
|
103
|
-
return {
|
|
104
|
-
content: [{ type: 'text', text: JSON.stringify(data, null, 2) }],
|
|
105
|
-
};
|
|
106
|
-
} catch (error) {
|
|
107
|
-
return {
|
|
108
|
-
content: [{
|
|
109
|
-
type: 'text',
|
|
110
|
-
text: JSON.stringify({ error: true, message: String(error) }),
|
|
111
|
-
}],
|
|
112
|
-
isError: true,
|
|
113
|
-
};
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
);
|
|
117
|
-
|
|
118
|
-
// GET endpoint
|
|
119
|
-
server.tool(
|
|
120
|
-
'get_item',
|
|
121
|
-
{
|
|
122
|
-
id: z.string().describe('Item ID'),
|
|
123
|
-
},
|
|
124
|
-
async (args) => {
|
|
125
|
-
try {
|
|
126
|
-
const data = await apiRequest(`/items/${args.id}`);
|
|
127
|
-
return {
|
|
128
|
-
content: [{ type: 'text', text: JSON.stringify(data, null, 2) }],
|
|
129
|
-
};
|
|
130
|
-
} catch (error) {
|
|
131
|
-
return {
|
|
132
|
-
content: [{
|
|
133
|
-
type: 'text',
|
|
134
|
-
text: JSON.stringify({ error: true, message: String(error) }),
|
|
135
|
-
}],
|
|
136
|
-
isError: true,
|
|
137
|
-
};
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
);
|
|
141
|
-
|
|
142
|
-
// CREATE endpoint
|
|
143
|
-
server.tool(
|
|
144
|
-
'create_item',
|
|
145
|
-
{
|
|
146
|
-
name: z.string().describe('Item name'),
|
|
147
|
-
description: z.string().optional().describe('Item description'),
|
|
148
|
-
tags: z.array(z.string()).optional().describe('Item tags'),
|
|
149
|
-
},
|
|
150
|
-
async (args) => {
|
|
151
|
-
try {
|
|
152
|
-
const data = await apiRequest('/items', 'POST', args);
|
|
153
|
-
return {
|
|
154
|
-
content: [{ type: 'text', text: JSON.stringify(data, null, 2) }],
|
|
155
|
-
};
|
|
156
|
-
} catch (error) {
|
|
157
|
-
return {
|
|
158
|
-
content: [{
|
|
159
|
-
type: 'text',
|
|
160
|
-
text: JSON.stringify({ error: true, message: String(error) }),
|
|
161
|
-
}],
|
|
162
|
-
isError: true,
|
|
163
|
-
};
|
|
164
|
-
}
|
|
165
|
-
}
|
|
166
|
-
);
|
|
167
|
-
|
|
168
|
-
// UPDATE endpoint
|
|
169
|
-
server.tool(
|
|
170
|
-
'update_item',
|
|
171
|
-
{
|
|
172
|
-
id: z.string().describe('Item ID'),
|
|
173
|
-
name: z.string().optional().describe('New name'),
|
|
174
|
-
description: z.string().optional().describe('New description'),
|
|
175
|
-
tags: z.array(z.string()).optional().describe('New tags'),
|
|
176
|
-
},
|
|
177
|
-
async (args) => {
|
|
178
|
-
try {
|
|
179
|
-
const { id, ...updates } = args;
|
|
180
|
-
const data = await apiRequest(`/items/${id}`, 'PUT', updates);
|
|
181
|
-
return {
|
|
182
|
-
content: [{ type: 'text', text: JSON.stringify(data, null, 2) }],
|
|
183
|
-
};
|
|
184
|
-
} catch (error) {
|
|
185
|
-
return {
|
|
186
|
-
content: [{
|
|
187
|
-
type: 'text',
|
|
188
|
-
text: JSON.stringify({ error: true, message: String(error) }),
|
|
189
|
-
}],
|
|
190
|
-
isError: true,
|
|
191
|
-
};
|
|
192
|
-
}
|
|
193
|
-
}
|
|
194
|
-
);
|
|
195
|
-
|
|
196
|
-
// DELETE endpoint
|
|
197
|
-
server.tool(
|
|
198
|
-
'delete_item',
|
|
199
|
-
{
|
|
200
|
-
id: z.string().describe('Item ID'),
|
|
201
|
-
confirm: z.boolean().describe('Confirm deletion'),
|
|
202
|
-
},
|
|
203
|
-
async (args) => {
|
|
204
|
-
if (!args.confirm) {
|
|
205
|
-
return {
|
|
206
|
-
content: [{
|
|
207
|
-
type: 'text',
|
|
208
|
-
text: JSON.stringify({ error: true, message: 'Deletion not confirmed' }),
|
|
209
|
-
}],
|
|
210
|
-
isError: true,
|
|
211
|
-
};
|
|
212
|
-
}
|
|
213
|
-
try {
|
|
214
|
-
await apiRequest(`/items/${args.id}`, 'DELETE');
|
|
215
|
-
return {
|
|
216
|
-
content: [{
|
|
217
|
-
type: 'text',
|
|
218
|
-
text: JSON.stringify({ success: true, deleted: args.id }),
|
|
219
|
-
}],
|
|
220
|
-
};
|
|
221
|
-
} catch (error) {
|
|
222
|
-
return {
|
|
223
|
-
content: [{
|
|
224
|
-
type: 'text',
|
|
225
|
-
text: JSON.stringify({ error: true, message: String(error) }),
|
|
226
|
-
}],
|
|
227
|
-
isError: true,
|
|
228
|
-
};
|
|
229
|
-
}
|
|
230
|
-
}
|
|
231
|
-
);
|
|
232
|
-
|
|
233
|
-
// Expose API docs as resource
|
|
234
|
-
server.resource('API Documentation', 'resource://api-docs', async () => ({
|
|
235
|
-
contents: [{
|
|
236
|
-
uri: 'resource://api-docs',
|
|
237
|
-
mimeType: 'text/markdown',
|
|
238
|
-
text: `# Example API MCP
|
|
239
|
-
|
|
240
|
-
## Available Tools
|
|
241
|
-
|
|
242
|
-
- \`list_items\` - List all items with pagination
|
|
243
|
-
- \`get_item\` - Get a single item by ID
|
|
244
|
-
- \`create_item\` - Create a new item
|
|
245
|
-
- \`update_item\` - Update an existing item
|
|
246
|
-
- \`delete_item\` - Delete an item (requires confirmation)
|
|
247
|
-
|
|
248
|
-
## Authentication
|
|
249
|
-
|
|
250
|
-
API key is configured via \`API_KEY\` environment variable.
|
|
251
|
-
`,
|
|
252
|
-
}],
|
|
253
|
-
}));
|
|
254
|
-
},
|
|
255
|
-
})
|
|
256
|
-
)
|
|
257
|
-
.listen(3000);
|
|
258
|
-
|
|
259
|
-
console.log('MCP Server running on http://localhost:3000/mcp');
|
|
260
|
-
```
|
|
261
|
-
|
|
262
|
-
## Stdio Version (for OpenCode/Claude)
|
|
263
|
-
|
|
264
|
-
```typescript
|
|
265
|
-
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
266
|
-
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
267
|
-
import { z } from 'zod';
|
|
268
|
-
|
|
269
|
-
const API_BASE = process.env.API_BASE_URL || 'https://api.example.com';
|
|
270
|
-
const API_KEY = process.env.API_KEY;
|
|
271
|
-
|
|
272
|
-
async function apiRequest(endpoint: string, method = 'GET', body?: unknown) {
|
|
273
|
-
const response = await fetch(`${API_BASE}${endpoint}`, {
|
|
274
|
-
method,
|
|
275
|
-
headers: {
|
|
276
|
-
'Authorization': `Bearer ${API_KEY}`,
|
|
277
|
-
'Content-Type': 'application/json',
|
|
278
|
-
},
|
|
279
|
-
body: body ? JSON.stringify(body) : undefined,
|
|
280
|
-
});
|
|
281
|
-
if (!response.ok) throw new Error(`API Error ${response.status}`);
|
|
282
|
-
return response.json();
|
|
283
|
-
}
|
|
284
|
-
|
|
285
|
-
const server = new McpServer({
|
|
286
|
-
name: 'example-api-mcp',
|
|
287
|
-
version: '1.0.0',
|
|
288
|
-
});
|
|
289
|
-
|
|
290
|
-
server.tool(
|
|
291
|
-
'list_items',
|
|
292
|
-
{ limit: z.number().optional().default(20) },
|
|
293
|
-
async (args) => {
|
|
294
|
-
const data = await apiRequest(`/items?limit=${args.limit}`);
|
|
295
|
-
return { content: [{ type: 'text', text: JSON.stringify(data) }] };
|
|
296
|
-
}
|
|
297
|
-
);
|
|
298
|
-
|
|
299
|
-
// Add more tools...
|
|
300
|
-
|
|
301
|
-
const transport = new StdioServerTransport();
|
|
302
|
-
await server.connect(transport);
|
|
303
|
-
```
|
|
304
|
-
|
|
305
|
-
## OpenCode Configuration
|
|
306
|
-
|
|
307
|
-
```json
|
|
308
|
-
{
|
|
309
|
-
"mcp": {
|
|
310
|
-
"example-api": {
|
|
311
|
-
"type": "local",
|
|
312
|
-
"command": [
|
|
313
|
-
"/bin/bash",
|
|
314
|
-
"-c",
|
|
315
|
-
"API_KEY=$EXAMPLE_API_KEY bun run /path/to/example-api-mcp/src/index.ts"
|
|
316
|
-
],
|
|
317
|
-
"enabled": true
|
|
318
|
-
}
|
|
319
|
-
}
|
|
320
|
-
}
|
|
321
|
-
```
|
|
322
|
-
|
|
323
|
-
## Common API Patterns
|
|
324
|
-
|
|
325
|
-
### Pagination
|
|
326
|
-
|
|
327
|
-
```typescript
|
|
328
|
-
server.tool(
|
|
329
|
-
'list_paginated',
|
|
330
|
-
{
|
|
331
|
-
cursor: z.string().optional().describe('Pagination cursor'),
|
|
332
|
-
limit: z.number().optional().default(50).describe('Items per page'),
|
|
333
|
-
},
|
|
334
|
-
async (args) => {
|
|
335
|
-
const params = new URLSearchParams({ limit: String(args.limit) });
|
|
336
|
-
if (args.cursor) params.set('cursor', args.cursor);
|
|
337
|
-
|
|
338
|
-
const data = await apiRequest(`/items?${params}`);
|
|
339
|
-
return {
|
|
340
|
-
content: [{
|
|
341
|
-
type: 'text',
|
|
342
|
-
text: JSON.stringify({
|
|
343
|
-
items: data.items,
|
|
344
|
-
nextCursor: data.next_cursor,
|
|
345
|
-
hasMore: !!data.next_cursor,
|
|
346
|
-
}, null, 2),
|
|
347
|
-
}],
|
|
348
|
-
};
|
|
349
|
-
}
|
|
350
|
-
);
|
|
351
|
-
```
|
|
352
|
-
|
|
353
|
-
### Search
|
|
354
|
-
|
|
355
|
-
```typescript
|
|
356
|
-
server.tool(
|
|
357
|
-
'search',
|
|
358
|
-
{
|
|
359
|
-
query: z.string().describe('Search query'),
|
|
360
|
-
fields: z.array(z.string()).optional().describe('Fields to search'),
|
|
361
|
-
sort: z.enum(['relevance', 'date', 'name']).optional().default('relevance'),
|
|
362
|
-
},
|
|
363
|
-
async (args) => {
|
|
364
|
-
const data = await apiRequest('/search', 'POST', {
|
|
365
|
-
q: args.query,
|
|
366
|
-
fields: args.fields,
|
|
367
|
-
sort: args.sort,
|
|
368
|
-
});
|
|
369
|
-
return {
|
|
370
|
-
content: [{ type: 'text', text: JSON.stringify(data, null, 2) }],
|
|
371
|
-
};
|
|
372
|
-
}
|
|
373
|
-
);
|
|
374
|
-
```
|
|
375
|
-
|
|
376
|
-
### Batch Operations
|
|
377
|
-
|
|
378
|
-
```typescript
|
|
379
|
-
server.tool(
|
|
380
|
-
'batch_update',
|
|
381
|
-
{
|
|
382
|
-
ids: z.array(z.string()).describe('Item IDs to update'),
|
|
383
|
-
updates: z.object({
|
|
384
|
-
status: z.string().optional(),
|
|
385
|
-
tags: z.array(z.string()).optional(),
|
|
386
|
-
}).describe('Updates to apply'),
|
|
387
|
-
},
|
|
388
|
-
async (args) => {
|
|
389
|
-
const results = await Promise.all(
|
|
390
|
-
args.ids.map(id =>
|
|
391
|
-
apiRequest(`/items/${id}`, 'PUT', args.updates)
|
|
392
|
-
.then(data => ({ id, success: true, data }))
|
|
393
|
-
.catch(error => ({ id, success: false, error: String(error) }))
|
|
394
|
-
)
|
|
395
|
-
);
|
|
396
|
-
return {
|
|
397
|
-
content: [{ type: 'text', text: JSON.stringify(results, null, 2) }],
|
|
398
|
-
};
|
|
399
|
-
}
|
|
400
|
-
);
|
|
401
|
-
```
|
|
402
|
-
|
|
403
|
-
### File Upload
|
|
404
|
-
|
|
405
|
-
```typescript
|
|
406
|
-
server.tool(
|
|
407
|
-
'upload_file',
|
|
408
|
-
{
|
|
409
|
-
filename: z.string().describe('File name'),
|
|
410
|
-
content: z.string().describe('Base64 encoded file content'),
|
|
411
|
-
mimeType: z.string().optional().default('application/octet-stream'),
|
|
412
|
-
},
|
|
413
|
-
async (args) => {
|
|
414
|
-
const response = await fetch(`${API_BASE}/upload`, {
|
|
415
|
-
method: 'POST',
|
|
416
|
-
headers: {
|
|
417
|
-
'Authorization': `Bearer ${API_KEY}`,
|
|
418
|
-
'Content-Type': args.mimeType,
|
|
419
|
-
'X-Filename': args.filename,
|
|
420
|
-
},
|
|
421
|
-
body: Buffer.from(args.content, 'base64'),
|
|
422
|
-
});
|
|
423
|
-
const data = await response.json();
|
|
424
|
-
return {
|
|
425
|
-
content: [{ type: 'text', text: JSON.stringify(data, null, 2) }],
|
|
426
|
-
};
|
|
427
|
-
}
|
|
428
|
-
);
|
|
429
|
-
```
|
|
430
|
-
|
|
431
|
-
## Testing
|
|
432
|
-
|
|
433
|
-
```bash
|
|
434
|
-
# Start server
|
|
435
|
-
bun run src/index.ts
|
|
436
|
-
|
|
437
|
-
# Test with MCP Inspector
|
|
438
|
-
npx @modelcontextprotocol/inspector
|
|
439
|
-
# Connect to http://localhost:3000/mcp
|
|
440
|
-
|
|
441
|
-
# Or test directly
|
|
442
|
-
curl -X POST http://localhost:3000/mcp \
|
|
443
|
-
-H "Content-Type: application/json" \
|
|
444
|
-
-d '{"jsonrpc":"2.0","method":"tools/list","id":1}'
|
|
445
|
-
```
|
|
@@ -1,240 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: build-mcp
|
|
3
|
-
description: MCP server development - building Model Context Protocol servers and tools
|
|
4
|
-
mode: subagent
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
# Build-MCP - MCP Server Development Agent
|
|
8
|
-
|
|
9
|
-
<!-- AI-CONTEXT-START -->
|
|
10
|
-
|
|
11
|
-
## Quick Reference
|
|
12
|
-
|
|
13
|
-
- **Purpose**: Build MCP servers with TypeScript + Bun + ElysiaJS
|
|
14
|
-
- **Stack**: `@modelcontextprotocol/sdk` + `elysia-mcp` + Zod
|
|
15
|
-
- **Starter**: `bun create https://github.com/kerlos/elysia-mcp-starter`
|
|
16
|
-
- **Inspector**: `npx @modelcontextprotocol/inspector`
|
|
17
|
-
|
|
18
|
-
**Quick Start**:
|
|
19
|
-
|
|
20
|
-
```bash
|
|
21
|
-
bun create https://github.com/kerlos/elysia-mcp-starter my-mcp
|
|
22
|
-
cd my-mcp && bun install && bun run dev
|
|
23
|
-
npx @modelcontextprotocol/inspector # Connect to http://localhost:3000/mcp
|
|
24
|
-
```
|
|
25
|
-
|
|
26
|
-
**Subagents** (in this folder):
|
|
27
|
-
|
|
28
|
-
| Subagent | When to Read |
|
|
29
|
-
|----------|--------------|
|
|
30
|
-
| `server-patterns.md` | Registering tools, resources, prompts |
|
|
31
|
-
| `transports.md` | Configuring stdio, HTTP, SSE |
|
|
32
|
-
| `deployment.md` | Adding MCP to AI assistants |
|
|
33
|
-
| `api-wrapper.md` | Wrapping REST APIs as MCP |
|
|
34
|
-
|
|
35
|
-
**Related Agents**:
|
|
36
|
-
- `@code-standards` for linting TypeScript
|
|
37
|
-
- `tools/context/context7.md` for MCP SDK docs
|
|
38
|
-
|
|
39
|
-
**Git Workflow**:
|
|
40
|
-
- Branch strategy: `workflows/branch.md`
|
|
41
|
-
- Git operations: `tools/git.md`
|
|
42
|
-
|
|
43
|
-
**Testing**: Use OpenCode CLI to test new MCPs without restarting TUI:
|
|
44
|
-
|
|
45
|
-
```bash
|
|
46
|
-
opencode run "Test [mcp] tools" --agent Build+
|
|
47
|
-
```
|
|
48
|
-
|
|
49
|
-
See `tools/opencode/opencode.md` for CLI testing patterns.
|
|
50
|
-
|
|
51
|
-
**MCPs to Enable**: context7, augment-context-engine, repomix
|
|
52
|
-
|
|
53
|
-
<!-- AI-CONTEXT-END -->
|
|
54
|
-
|
|
55
|
-
## Why TypeScript + Bun + ElysiaJS?
|
|
56
|
-
|
|
57
|
-
| Criterion | Why This Stack |
|
|
58
|
-
|-----------|----------------|
|
|
59
|
-
| **Robustness** | Official MCP SDK, Zod validation, full spec compliance |
|
|
60
|
-
| **Speed** | Bun is 3-4x faster than Node.js |
|
|
61
|
-
| **Maintainability** | End-to-end type safety, auto-generated OpenAPI docs |
|
|
62
|
-
| **Future-Proof** | Anthropic-backed spec, growing ecosystem |
|
|
63
|
-
|
|
64
|
-
## Project Structure
|
|
65
|
-
|
|
66
|
-
```text
|
|
67
|
-
my-mcp/
|
|
68
|
-
├── src/
|
|
69
|
-
│ ├── index.ts # Server entry point
|
|
70
|
-
│ ├── tools/ # Tool implementations
|
|
71
|
-
│ ├── resources/ # Resource handlers
|
|
72
|
-
│ └── prompts/ # Prompt templates
|
|
73
|
-
├── package.json
|
|
74
|
-
├── tsconfig.json
|
|
75
|
-
└── bunfig.toml
|
|
76
|
-
```
|
|
77
|
-
|
|
78
|
-
## Core Patterns
|
|
79
|
-
|
|
80
|
-
See `build-mcp/server-patterns.md` for complete tool, resource, and prompt registration patterns.
|
|
81
|
-
|
|
82
|
-
**Minimal tool example**:
|
|
83
|
-
|
|
84
|
-
```typescript
|
|
85
|
-
server.tool(
|
|
86
|
-
'get_data',
|
|
87
|
-
{ query: z.string().describe('Search query') },
|
|
88
|
-
async (args) => ({
|
|
89
|
-
content: [{ type: 'text', text: JSON.stringify(await fetchData(args.query)) }],
|
|
90
|
-
})
|
|
91
|
-
);
|
|
92
|
-
```
|
|
93
|
-
|
|
94
|
-
## Transport Selection
|
|
95
|
-
|
|
96
|
-
| Transport | Use Case |
|
|
97
|
-
|-----------|----------|
|
|
98
|
-
| stdio | Local dev, AI assistant spawns process |
|
|
99
|
-
| StreamableHTTP | Production HTTP servers |
|
|
100
|
-
| SSE | Legacy compatibility only |
|
|
101
|
-
|
|
102
|
-
See `build-mcp/transports.md` for complete transport configuration.
|
|
103
|
-
|
|
104
|
-
## Testing & Debugging
|
|
105
|
-
|
|
106
|
-
```bash
|
|
107
|
-
npx @modelcontextprotocol/inspector # Connect to http://localhost:3000/mcp
|
|
108
|
-
```
|
|
109
|
-
|
|
110
|
-
Use `console.error()` for logging (stdout is MCP protocol).
|
|
111
|
-
|
|
112
|
-
## Deployment
|
|
113
|
-
|
|
114
|
-
See `build-mcp/deployment.md` for all AI assistant configurations.
|
|
115
|
-
|
|
116
|
-
**OpenCode** (`~/.config/opencode/opencode.json`):
|
|
117
|
-
|
|
118
|
-
```json
|
|
119
|
-
{
|
|
120
|
-
"mcp": {
|
|
121
|
-
"my-mcp": {
|
|
122
|
-
"type": "local",
|
|
123
|
-
"command": ["bun", "run", "/path/to/my-mcp/src/index.ts"],
|
|
124
|
-
"enabled": true
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
```
|
|
129
|
-
|
|
130
|
-
**Claude Code**: `claude mcp add my-mcp bun run /path/to/my-mcp/src/index.ts`
|
|
131
|
-
|
|
132
|
-
## AI-Friendly Tool Design
|
|
133
|
-
|
|
134
|
-
See `build-mcp/server-patterns.md` for complete naming conventions.
|
|
135
|
-
|
|
136
|
-
**Key rules**:
|
|
137
|
-
- Name: `verb_noun` pattern (`get_user`, `list_items`, `create_order`)
|
|
138
|
-
- Description: What it does, when to use, what it returns, side effects
|
|
139
|
-
- Parameters: Always use `.describe()` with constraints
|
|
140
|
-
|
|
141
|
-
```typescript
|
|
142
|
-
// Good
|
|
143
|
-
server.tool(
|
|
144
|
-
'get_user',
|
|
145
|
-
'Retrieves user by ID. Returns profile or null if not found.',
|
|
146
|
-
{ id: z.string().uuid().describe('User ID (UUID format)') }
|
|
147
|
-
);
|
|
148
|
-
```
|
|
149
|
-
|
|
150
|
-
## Common Patterns (Not Yet in Subagents)
|
|
151
|
-
|
|
152
|
-
These patterns are frequently needed but not yet documented in subagents:
|
|
153
|
-
|
|
154
|
-
### Authentication
|
|
155
|
-
|
|
156
|
-
```typescript
|
|
157
|
-
// API Key from environment
|
|
158
|
-
const API_KEY = process.env.API_KEY;
|
|
159
|
-
if (!API_KEY) throw new Error('API_KEY required');
|
|
160
|
-
|
|
161
|
-
// OAuth token refresh (implement in your auth module)
|
|
162
|
-
async function getAccessToken(): Promise<string> {
|
|
163
|
-
// Check cache, refresh if expired
|
|
164
|
-
}
|
|
165
|
-
```
|
|
166
|
-
|
|
167
|
-
### Rate Limiting
|
|
168
|
-
|
|
169
|
-
```typescript
|
|
170
|
-
import { Ratelimit } from '@upstash/ratelimit';
|
|
171
|
-
import { Redis } from '@upstash/redis';
|
|
172
|
-
|
|
173
|
-
const ratelimit = new Ratelimit({
|
|
174
|
-
redis: Redis.fromEnv(),
|
|
175
|
-
limiter: Ratelimit.slidingWindow(10, '10 s'),
|
|
176
|
-
});
|
|
177
|
-
|
|
178
|
-
// In tool handler
|
|
179
|
-
const { success } = await ratelimit.limit(identifier);
|
|
180
|
-
if (!success) return { content: [{ type: 'text', text: 'Rate limited' }], isError: true };
|
|
181
|
-
```
|
|
182
|
-
|
|
183
|
-
### Retry Logic
|
|
184
|
-
|
|
185
|
-
```typescript
|
|
186
|
-
async function withRetry<T>(fn: () => Promise<T>, retries = 3): Promise<T> {
|
|
187
|
-
for (let i = 0; i < retries; i++) {
|
|
188
|
-
try { return await fn(); }
|
|
189
|
-
catch (e) { if (i === retries - 1) throw e; await sleep(1000 * 2 ** i); }
|
|
190
|
-
}
|
|
191
|
-
throw new Error('Unreachable');
|
|
192
|
-
}
|
|
193
|
-
```
|
|
194
|
-
|
|
195
|
-
## Quality Standards
|
|
196
|
-
|
|
197
|
-
1. **Validation**: Zod schemas with `.describe()`
|
|
198
|
-
2. **Errors**: Return structured JSON in content, set `isError: true`
|
|
199
|
-
3. **Logging**: `console.error()` only (stdout is protocol)
|
|
200
|
-
4. **Types**: Export input/output types
|
|
201
|
-
|
|
202
|
-
Run `@code-standards` before committing TypeScript.
|
|
203
|
-
|
|
204
|
-
## References
|
|
205
|
-
|
|
206
|
-
Use Context7 MCP for current documentation:
|
|
207
|
-
- MCP SDK: `resolve library-id for @modelcontextprotocol/sdk`
|
|
208
|
-
- ElysiaJS: `resolve library-id for elysia`
|
|
209
|
-
- Bun: `resolve library-id for bun`
|
|
210
|
-
|
|
211
|
-
## Oh-My-OpenCode Integration
|
|
212
|
-
|
|
213
|
-
When oh-my-opencode is installed, leverage these specialized agents for enhanced MCP development:
|
|
214
|
-
|
|
215
|
-
| OmO Agent | When to Use | Example |
|
|
216
|
-
|-----------|-------------|---------|
|
|
217
|
-
| `@oracle` | MCP architecture, API design, debugging strategy | "Ask @oracle to review this MCP tool structure" |
|
|
218
|
-
| `@librarian` | Find MCP examples, SDK patterns, similar implementations | "Ask @librarian for MCP tool registration examples" |
|
|
219
|
-
| `@frontend-ui-ux-engineer` | If MCP has web UI components | "Ask @frontend-ui-ux-engineer to build the MCP dashboard" |
|
|
220
|
-
|
|
221
|
-
**MCP Development Workflow Enhancement**:
|
|
222
|
-
|
|
223
|
-
```text
|
|
224
|
-
1. Design → @oracle reviews API structure
|
|
225
|
-
2. Patterns → @librarian finds SDK examples
|
|
226
|
-
3. Implement → Build-MCP creates server
|
|
227
|
-
4. Test → MCP Inspector validates
|
|
228
|
-
5. Deploy → Configure in AI assistants
|
|
229
|
-
```
|
|
230
|
-
|
|
231
|
-
**LSP Tools for TypeScript MCP Development**:
|
|
232
|
-
|
|
233
|
-
When oh-my-opencode is installed, use LSP tools for better TypeScript development:
|
|
234
|
-
- `lsp_goto_definition` - Navigate to MCP SDK types
|
|
235
|
-
- `lsp_find_references` - Find all tool usages
|
|
236
|
-
- `lsp_rename` - Safely rename tools across codebase
|
|
237
|
-
- `lsp_diagnostics` - Catch TypeScript errors before runtime
|
|
238
|
-
|
|
239
|
-
**Note**: These agents require [oh-my-opencode](https://github.com/code-yeongyu/oh-my-opencode) plugin.
|
|
240
|
-
See `tools/opencode/oh-my-opencode.md` for installation.
|