@hailer/mcp 1.1.12 → 1.1.13
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/CHANGELOG.md +0 -7
- package/{.claude → dist}/CLAUDE.md +2 -2
- package/dist/app.js +18 -5
- package/dist/bot/bot-config.d.ts +10 -1
- package/dist/bot/bot-config.js +64 -3
- package/dist/bot/bot-manager.d.ts +2 -0
- package/dist/bot/bot-manager.js +9 -2
- package/dist/bot/bot.d.ts +33 -0
- package/dist/bot/bot.js +461 -160
- package/dist/bot/services/message-classifier.js +17 -0
- package/dist/bot/services/permission-guard.d.ts +52 -0
- package/dist/bot/services/permission-guard.js +149 -0
- package/dist/bot/services/types.d.ts +5 -0
- package/dist/bot/services/typing-indicator.d.ts +6 -1
- package/dist/bot/services/typing-indicator.js +19 -3
- package/dist/cli.js +0 -0
- package/dist/config.d.ts +6 -1
- package/dist/config.js +43 -0
- package/dist/core.js +3 -6
- package/dist/lib/discussion-lock.d.ts +42 -0
- package/dist/lib/discussion-lock.js +110 -0
- package/dist/mcp/UserContextCache.d.ts +5 -0
- package/dist/mcp/UserContextCache.js +51 -19
- package/dist/mcp/hailer-clients.d.ts +19 -1
- package/dist/mcp/hailer-clients.js +158 -24
- package/dist/mcp/session-store.d.ts +68 -0
- package/dist/mcp/session-store.js +169 -0
- package/dist/mcp/signal-handler.js +2 -0
- package/dist/mcp/tool-registry.d.ts +17 -4
- package/dist/mcp/tool-registry.js +37 -7
- package/dist/mcp/tools/activity.js +99 -7
- package/dist/mcp/tools/app-scaffold.js +304 -336
- package/dist/mcp/tools/bot-config/constants.d.ts +23 -0
- package/dist/mcp/tools/bot-config/constants.js +94 -0
- package/dist/mcp/tools/bot-config/core.d.ts +253 -0
- package/dist/mcp/tools/bot-config/core.js +2456 -0
- package/dist/mcp/tools/bot-config/index.d.ts +10 -0
- package/dist/mcp/tools/bot-config/index.js +59 -0
- package/dist/mcp/tools/bot-config/tools.d.ts +7 -0
- package/dist/mcp/tools/bot-config/tools.js +15 -0
- package/dist/mcp/tools/bot-config/types.d.ts +50 -0
- package/dist/mcp/tools/bot-config/types.js +6 -0
- package/dist/mcp/tools/bug-fixer-tools.d.ts +45 -0
- package/dist/mcp/tools/bug-fixer-tools.js +1096 -0
- package/dist/mcp/tools/company.d.ts +9 -0
- package/dist/mcp/tools/company.js +88 -0
- package/dist/mcp/tools/discussion.js +68 -0
- package/dist/mcp/tools/document.d.ts +11 -0
- package/dist/mcp/tools/document.js +741 -0
- package/dist/mcp/tools/investigate.d.ts +9 -0
- package/dist/mcp/tools/investigate.js +254 -0
- package/dist/mcp/tools/workflow-permissions.d.ts +15 -0
- package/dist/mcp/tools/workflow-permissions.js +204 -0
- package/dist/mcp/tools/workflow.js +57 -18
- package/dist/mcp/utils/index.d.ts +2 -0
- package/dist/mcp/utils/index.js +12 -1
- package/dist/mcp/utils/role-utils.d.ts +74 -0
- package/dist/mcp/utils/role-utils.js +151 -0
- package/dist/mcp/utils/types.d.ts +43 -1
- package/dist/mcp/utils/types.js +14 -0
- package/dist/mcp/webhook-handler.d.ts +4 -0
- package/dist/mcp/webhook-handler.js +8 -0
- package/dist/mcp-server.d.ts +23 -2
- package/dist/mcp-server.js +639 -127
- package/dist/plugins/vipunen/client.d.ts +150 -0
- package/dist/plugins/vipunen/client.js +535 -0
- package/dist/plugins/vipunen/config/schema-config.json +19 -0
- package/dist/plugins/vipunen/config/schema-doc.json +22 -0
- package/dist/plugins/vipunen/index.d.ts +41 -0
- package/dist/plugins/vipunen/index.js +88 -0
- package/dist/plugins/vipunen/tools.d.ts +26 -0
- package/dist/plugins/vipunen/tools.js +501 -0
- package/dist/stdio-server.d.ts +14 -0
- package/dist/stdio-server.js +101 -0
- package/package.json +2 -1
- package/.claude/agents/agent-ada-skill-builder.md +0 -94
- package/.claude/agents/agent-alejandro-function-fields.md +0 -342
- package/.claude/agents/agent-bjorn-config-audit.md +0 -103
- package/.claude/agents/agent-builder-agent-creator.md +0 -130
- package/.claude/agents/agent-code-simplifier.md +0 -53
- package/.claude/agents/agent-dmitri-activity-crud.md +0 -159
- package/.claude/agents/agent-giuseppe-app-builder.md +0 -247
- package/.claude/agents/agent-gunther-mcp-tools.md +0 -39
- package/.claude/agents/agent-helga-workflow-config.md +0 -204
- package/.claude/agents/agent-igor-activity-mover-automation.md +0 -125
- package/.claude/agents/agent-ingrid-doc-templates.md +0 -261
- package/.claude/agents/agent-ivan-monolith.md +0 -154
- package/.claude/agents/agent-kenji-data-reader.md +0 -86
- package/.claude/agents/agent-lars-code-inspector.md +0 -102
- package/.claude/agents/agent-marco-mockup-builder.md +0 -110
- package/.claude/agents/agent-marcus-api-documenter.md +0 -323
- package/.claude/agents/agent-marketplace-publisher.md +0 -280
- package/.claude/agents/agent-marketplace-reviewer.md +0 -309
- package/.claude/agents/agent-permissions-handler.md +0 -208
- package/.claude/agents/agent-simple-writer.md +0 -48
- package/.claude/agents/agent-svetlana-code-review.md +0 -171
- package/.claude/agents/agent-tanya-test-runner.md +0 -333
- package/.claude/agents/agent-ui-designer.md +0 -100
- package/.claude/agents/agent-viktor-sql-insights.md +0 -212
- package/.claude/agents/agent-web-search.md +0 -55
- package/.claude/agents/agent-yevgeni-discussions.md +0 -45
- package/.claude/agents/agent-zara-zapier.md +0 -159
- package/.claude/commands/app-squad.md +0 -135
- package/.claude/commands/audit-squad.md +0 -158
- package/.claude/commands/autoplan.md +0 -563
- package/.claude/commands/cleanup-squad.md +0 -98
- package/.claude/commands/config-squad.md +0 -106
- package/.claude/commands/crud-squad.md +0 -87
- package/.claude/commands/data-squad.md +0 -97
- package/.claude/commands/debug-squad.md +0 -303
- package/.claude/commands/doc-squad.md +0 -65
- package/.claude/commands/handoff.md +0 -137
- package/.claude/commands/health.md +0 -49
- package/.claude/commands/help.md +0 -29
- package/.claude/commands/help:agents.md +0 -151
- package/.claude/commands/help:commands.md +0 -78
- package/.claude/commands/help:faq.md +0 -79
- package/.claude/commands/help:plugins.md +0 -50
- package/.claude/commands/help:skills.md +0 -93
- package/.claude/commands/help:tools.md +0 -75
- package/.claude/commands/hotfix-squad.md +0 -112
- package/.claude/commands/integration-squad.md +0 -82
- package/.claude/commands/janitor-squad.md +0 -167
- package/.claude/commands/learn-auto.md +0 -120
- package/.claude/commands/learn.md +0 -120
- package/.claude/commands/mcp-list.md +0 -27
- package/.claude/commands/onboard-squad.md +0 -140
- package/.claude/commands/plan-workspace.md +0 -732
- package/.claude/commands/prd.md +0 -130
- package/.claude/commands/project-status.md +0 -82
- package/.claude/commands/publish.md +0 -138
- package/.claude/commands/recap.md +0 -69
- package/.claude/commands/restore.md +0 -64
- package/.claude/commands/review-squad.md +0 -152
- package/.claude/commands/save.md +0 -24
- package/.claude/commands/stats.md +0 -19
- package/.claude/commands/swarm.md +0 -210
- package/.claude/commands/tool-builder.md +0 -39
- package/.claude/commands/ws-pull.md +0 -44
- package/.claude/hooks/_shared-memory.cjs +0 -305
- package/.claude/hooks/_utils.cjs +0 -108
- package/.claude/hooks/agent-failure-detector.cjs +0 -383
- package/.claude/hooks/agent-usage-logger.cjs +0 -204
- package/.claude/hooks/app-edit-guard.cjs +0 -494
- package/.claude/hooks/auto-learn.cjs +0 -304
- package/.claude/hooks/bash-guard.cjs +0 -272
- package/.claude/hooks/builder-mode-manager.cjs +0 -354
- package/.claude/hooks/bulk-activity-guard.cjs +0 -271
- package/.claude/hooks/context-watchdog.cjs +0 -230
- package/.claude/hooks/delegation-reminder.cjs +0 -465
- package/.claude/hooks/design-system-lint.cjs +0 -271
- package/.claude/hooks/post-scaffold-hook.cjs +0 -181
- package/.claude/hooks/prompt-guard.cjs +0 -354
- package/.claude/hooks/publish-template-guard.cjs +0 -147
- package/.claude/hooks/session-start.cjs +0 -35
- package/.claude/hooks/shared-memory-writer.cjs +0 -147
- package/.claude/hooks/skill-injector.cjs +0 -140
- package/.claude/hooks/skill-usage-logger.cjs +0 -258
- package/.claude/hooks/src-edit-guard.cjs +0 -240
- package/.claude/hooks/sync-marketplace-agents.cjs +0 -346
- package/.claude/settings.json +0 -257
- package/.claude/skills/SDK-activity-patterns/SKILL.md +0 -428
- package/.claude/skills/SDK-document-templates/SKILL.md +0 -1033
- package/.claude/skills/SDK-function-fields/SKILL.md +0 -542
- package/.claude/skills/SDK-generate-skill/SKILL.md +0 -92
- package/.claude/skills/SDK-init-skill/SKILL.md +0 -127
- package/.claude/skills/SDK-insight-queries/SKILL.md +0 -787
- package/.claude/skills/SDK-ws-config-skill/SKILL.md +0 -1139
- package/.claude/skills/agent-structure/SKILL.md +0 -98
- package/.claude/skills/api-documentation-patterns/SKILL.md +0 -474
- package/.claude/skills/chrome-mcp-reference/SKILL.md +0 -370
- package/.claude/skills/delegation-routing/SKILL.md +0 -202
- package/.claude/skills/frontend-design/SKILL.md +0 -254
- package/.claude/skills/hailer-activity-mover/SKILL.md +0 -213
- package/.claude/skills/hailer-api-client/SKILL.md +0 -518
- package/.claude/skills/hailer-app-builder/SKILL.md +0 -1434
- package/.claude/skills/hailer-apps-pictures/SKILL.md +0 -269
- package/.claude/skills/hailer-design-system/SKILL.md +0 -235
- package/.claude/skills/hailer-monolith-automations/SKILL.md +0 -686
- package/.claude/skills/hailer-permissions-system/SKILL.md +0 -121
- package/.claude/skills/hailer-project-protocol/SKILL.md +0 -488
- package/.claude/skills/hailer-rest-api/SKILL.md +0 -61
- package/.claude/skills/hailer-rest-api/hailer-activities.md +0 -184
- package/.claude/skills/hailer-rest-api/hailer-admin.md +0 -473
- package/.claude/skills/hailer-rest-api/hailer-calendar.md +0 -256
- package/.claude/skills/hailer-rest-api/hailer-feed.md +0 -249
- package/.claude/skills/hailer-rest-api/hailer-insights.md +0 -195
- package/.claude/skills/hailer-rest-api/hailer-messaging.md +0 -276
- package/.claude/skills/hailer-rest-api/hailer-workflows.md +0 -283
- package/.claude/skills/insight-join-patterns/SKILL.md +0 -174
- package/.claude/skills/integration-patterns/SKILL.md +0 -421
- package/.claude/skills/json-only-output/SKILL.md +0 -72
- package/.claude/skills/lsp-setup/SKILL.md +0 -160
- package/.claude/skills/mcp-direct-tools/SKILL.md +0 -153
- package/.claude/skills/optional-parameters/SKILL.md +0 -72
- package/.claude/skills/publish-hailer-app/SKILL.md +0 -244
- package/.claude/skills/testing-patterns/SKILL.md +0 -630
- package/.claude/skills/tool-builder/SKILL.md +0 -250
- package/.claude/skills/tool-parameter-usage/SKILL.md +0 -126
- package/.claude/skills/tool-response-verification/SKILL.md +0 -92
- package/.claude/skills/zapier-hailer-patterns/SKILL.md +0 -581
- package/.mcp.json +0 -13
- package/.opencode/agent/agent-ada-skill-builder.md +0 -35
- package/.opencode/agent/agent-alejandro-function-fields.md +0 -39
- package/.opencode/agent/agent-bjorn-config-audit.md +0 -36
- package/.opencode/agent/agent-builder-agent-creator.md +0 -39
- package/.opencode/agent/agent-code-simplifier.md +0 -31
- package/.opencode/agent/agent-dmitri-activity-crud.md +0 -40
- package/.opencode/agent/agent-giuseppe-app-builder.md +0 -37
- package/.opencode/agent/agent-gunther-mcp-tools.md +0 -39
- package/.opencode/agent/agent-helga-workflow-config.md +0 -203
- package/.opencode/agent/agent-igor-activity-mover-automation.md +0 -46
- package/.opencode/agent/agent-ingrid-doc-templates.md +0 -39
- package/.opencode/agent/agent-ivan-monolith.md +0 -46
- package/.opencode/agent/agent-kenji-data-reader.md +0 -53
- package/.opencode/agent/agent-lars-code-inspector.md +0 -28
- package/.opencode/agent/agent-marco-mockup-builder.md +0 -42
- package/.opencode/agent/agent-marcus-api-documenter.md +0 -53
- package/.opencode/agent/agent-marketplace-publisher.md +0 -44
- package/.opencode/agent/agent-marketplace-reviewer.md +0 -42
- package/.opencode/agent/agent-permissions-handler.md +0 -50
- package/.opencode/agent/agent-simple-writer.md +0 -45
- package/.opencode/agent/agent-svetlana-code-review.md +0 -39
- package/.opencode/agent/agent-tanya-test-runner.md +0 -57
- package/.opencode/agent/agent-ui-designer.md +0 -56
- package/.opencode/agent/agent-viktor-sql-insights.md +0 -34
- package/.opencode/agent/agent-web-search.md +0 -42
- package/.opencode/agent/agent-yevgeni-discussions.md +0 -37
- package/.opencode/agent/agent-zara-zapier.md +0 -53
- package/.opencode/commands/app-squad.md +0 -135
- package/.opencode/commands/audit-squad.md +0 -158
- package/.opencode/commands/autoplan.md +0 -563
- package/.opencode/commands/cleanup-squad.md +0 -98
- package/.opencode/commands/config-squad.md +0 -106
- package/.opencode/commands/crud-squad.md +0 -87
- package/.opencode/commands/data-squad.md +0 -97
- package/.opencode/commands/debug-squad.md +0 -303
- package/.opencode/commands/doc-squad.md +0 -65
- package/.opencode/commands/handoff.md +0 -137
- package/.opencode/commands/health.md +0 -49
- package/.opencode/commands/help-agents.md +0 -151
- package/.opencode/commands/help-commands.md +0 -32
- package/.opencode/commands/help-faq.md +0 -29
- package/.opencode/commands/help-plugins.md +0 -28
- package/.opencode/commands/help-skills.md +0 -7
- package/.opencode/commands/help-tools.md +0 -40
- package/.opencode/commands/help.md +0 -28
- package/.opencode/commands/hotfix-squad.md +0 -112
- package/.opencode/commands/integration-squad.md +0 -82
- package/.opencode/commands/janitor-squad.md +0 -167
- package/.opencode/commands/learn-auto.md +0 -120
- package/.opencode/commands/learn.md +0 -120
- package/.opencode/commands/mcp-list.md +0 -27
- package/.opencode/commands/onboard-squad.md +0 -140
- package/.opencode/commands/plan-workspace.md +0 -732
- package/.opencode/commands/prd.md +0 -131
- package/.opencode/commands/project-status.md +0 -82
- package/.opencode/commands/publish.md +0 -138
- package/.opencode/commands/recap.md +0 -69
- package/.opencode/commands/restore.md +0 -64
- package/.opencode/commands/review-squad.md +0 -152
- package/.opencode/commands/save.md +0 -24
- package/.opencode/commands/stats.md +0 -19
- package/.opencode/commands/swarm.md +0 -210
- package/.opencode/commands/tool-builder.md +0 -39
- package/.opencode/commands/ws-pull.md +0 -44
- package/.opencode/opencode.json +0 -28
- package/SESSION-HANDOFF.md +0 -68
- package/inbox/2026-03-04-bot-config-patterns.md +0 -24
- package/scripts/postinstall.cjs +0 -64
- package/scripts/test-hal-tools.ts +0 -154
|
@@ -1,250 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: tool-builder
|
|
3
|
-
description: Patterns for building MCP tools in Hailer MCP server
|
|
4
|
-
version: 1.0.0
|
|
5
|
-
triggers: MCP tool creation, Zod schemas, tool registration, API client usage
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
# MCP Tool Builder Patterns
|
|
9
|
-
|
|
10
|
-
## Tool Structure
|
|
11
|
-
|
|
12
|
-
MCP tools live in `src/mcp/tools/` and are registered in `src/app.ts`.
|
|
13
|
-
|
|
14
|
-
```typescript
|
|
15
|
-
// src/mcp/tools/example.ts
|
|
16
|
-
import { z } from 'zod';
|
|
17
|
-
import { McpTool, ToolContext } from '../types.js';
|
|
18
|
-
|
|
19
|
-
export const myTool: McpTool = {
|
|
20
|
-
name: 'my_tool',
|
|
21
|
-
description: 'What this tool does',
|
|
22
|
-
inputSchema: z.object({
|
|
23
|
-
requiredParam: z.string().describe('Description'),
|
|
24
|
-
optionalParam: z.coerce.number().optional().default(50)
|
|
25
|
-
}),
|
|
26
|
-
annotations: { toolGroup: 'READ' },
|
|
27
|
-
handler: async (args, context: ToolContext) => {
|
|
28
|
-
// Implementation
|
|
29
|
-
}
|
|
30
|
-
};
|
|
31
|
-
```
|
|
32
|
-
|
|
33
|
-
---
|
|
34
|
-
|
|
35
|
-
## Tool Groups
|
|
36
|
-
|
|
37
|
-
| Group | Purpose | Examples |
|
|
38
|
-
|-------|---------|----------|
|
|
39
|
-
| `READ` | Safe reads, no side effects | list_workflows, get_activity |
|
|
40
|
-
| `WRITE` | Create/update data | create_activity, update_activity |
|
|
41
|
-
| `PLAYGROUND` | Admin/testing tools | install_workflow, preview_insight |
|
|
42
|
-
| `NUCLEAR` | Destructive operations | remove_workflow, delete_activity |
|
|
43
|
-
|
|
44
|
-
---
|
|
45
|
-
|
|
46
|
-
## Zod Schema Coercion
|
|
47
|
-
|
|
48
|
-
MCP sends all values as strings. Use coercion:
|
|
49
|
-
|
|
50
|
-
```typescript
|
|
51
|
-
// Numbers
|
|
52
|
-
z.coerce.number().optional().default(50)
|
|
53
|
-
|
|
54
|
-
// Booleans
|
|
55
|
-
z.coerce.boolean().optional().default(true)
|
|
56
|
-
|
|
57
|
-
// Arrays (from JSON string)
|
|
58
|
-
z.preprocess(
|
|
59
|
-
(val) => typeof val === 'string' ? JSON.parse(val) : val,
|
|
60
|
-
z.array(z.string())
|
|
61
|
-
)
|
|
62
|
-
|
|
63
|
-
// Objects (from JSON string)
|
|
64
|
-
z.preprocess(
|
|
65
|
-
(val) => typeof val === 'string' ? JSON.parse(val) : val,
|
|
66
|
-
z.record(z.any())
|
|
67
|
-
)
|
|
68
|
-
|
|
69
|
-
// Optional with default
|
|
70
|
-
z.string().optional().default('default_value')
|
|
71
|
-
```
|
|
72
|
-
|
|
73
|
-
---
|
|
74
|
-
|
|
75
|
-
## API Client Methods
|
|
76
|
-
|
|
77
|
-
Access via `context.hailer`:
|
|
78
|
-
|
|
79
|
-
```typescript
|
|
80
|
-
// Socket API call
|
|
81
|
-
const result = await context.hailer.request('v3.endpoint.method', [arg1, arg2]);
|
|
82
|
-
|
|
83
|
-
// REST API call
|
|
84
|
-
const result = await context.hailer.callRest({
|
|
85
|
-
endpoint: '/api/v3/something',
|
|
86
|
-
method: 'POST',
|
|
87
|
-
body: { data }
|
|
88
|
-
});
|
|
89
|
-
|
|
90
|
-
// Convenience methods
|
|
91
|
-
const schema = await context.hailer.getWorkflowSchema(workflowId, phaseId);
|
|
92
|
-
const activity = await context.hailer.fetchActivityById(activityId);
|
|
93
|
-
```
|
|
94
|
-
|
|
95
|
-
---
|
|
96
|
-
|
|
97
|
-
## Type Discovery Workflow
|
|
98
|
-
|
|
99
|
-
When you don't know the exact API response shape:
|
|
100
|
-
|
|
101
|
-
1. **Implement with `any` + logging**
|
|
102
|
-
```typescript
|
|
103
|
-
handler: async (args, context) => {
|
|
104
|
-
const result = await context.hailer.request('v3.new.endpoint', [args.id]);
|
|
105
|
-
context.logger.debug('API response:', JSON.stringify(result, null, 2));
|
|
106
|
-
return { content: [{ type: 'text', text: JSON.stringify(result) }] };
|
|
107
|
-
}
|
|
108
|
-
```
|
|
109
|
-
|
|
110
|
-
2. **Test the tool** - Call it and check server logs
|
|
111
|
-
|
|
112
|
-
3. **Update to proper types** - Based on logged output
|
|
113
|
-
|
|
114
|
-
4. **Test again** - Verify typed version works
|
|
115
|
-
|
|
116
|
-
---
|
|
117
|
-
|
|
118
|
-
## Tool Registration
|
|
119
|
-
|
|
120
|
-
After creating a tool, register it in `src/app.ts`:
|
|
121
|
-
|
|
122
|
-
```typescript
|
|
123
|
-
// In src/app.ts
|
|
124
|
-
import { myTool } from './mcp/tools/example.js';
|
|
125
|
-
|
|
126
|
-
// Add to tools array
|
|
127
|
-
const tools = [
|
|
128
|
-
// ... existing tools
|
|
129
|
-
myTool,
|
|
130
|
-
];
|
|
131
|
-
```
|
|
132
|
-
|
|
133
|
-
---
|
|
134
|
-
|
|
135
|
-
## Common Patterns
|
|
136
|
-
|
|
137
|
-
### List endpoint
|
|
138
|
-
```typescript
|
|
139
|
-
export const listThings: McpTool = {
|
|
140
|
-
name: 'list_things',
|
|
141
|
-
description: 'List all things in workspace',
|
|
142
|
-
inputSchema: z.object({
|
|
143
|
-
limit: z.coerce.number().optional().default(100).describe('Max results')
|
|
144
|
-
}),
|
|
145
|
-
annotations: { toolGroup: 'READ' },
|
|
146
|
-
handler: async (args, context) => {
|
|
147
|
-
const result = await context.hailer.request('v3.thing.list', [
|
|
148
|
-
context.workspaceId,
|
|
149
|
-
{ limit: args.limit }
|
|
150
|
-
]);
|
|
151
|
-
return {
|
|
152
|
-
content: [{
|
|
153
|
-
type: 'text',
|
|
154
|
-
text: JSON.stringify(result, null, 2)
|
|
155
|
-
}]
|
|
156
|
-
};
|
|
157
|
-
}
|
|
158
|
-
};
|
|
159
|
-
```
|
|
160
|
-
|
|
161
|
-
### Get by ID endpoint
|
|
162
|
-
```typescript
|
|
163
|
-
export const getThing: McpTool = {
|
|
164
|
-
name: 'get_thing',
|
|
165
|
-
description: 'Get thing by ID',
|
|
166
|
-
inputSchema: z.object({
|
|
167
|
-
thingId: z.string().describe('Thing UUID')
|
|
168
|
-
}),
|
|
169
|
-
annotations: { toolGroup: 'READ' },
|
|
170
|
-
handler: async (args, context) => {
|
|
171
|
-
const result = await context.hailer.request('v3.thing.get', [args.thingId]);
|
|
172
|
-
return {
|
|
173
|
-
content: [{
|
|
174
|
-
type: 'text',
|
|
175
|
-
text: JSON.stringify(result, null, 2)
|
|
176
|
-
}]
|
|
177
|
-
};
|
|
178
|
-
}
|
|
179
|
-
};
|
|
180
|
-
```
|
|
181
|
-
|
|
182
|
-
### Create endpoint
|
|
183
|
-
```typescript
|
|
184
|
-
export const createThing: McpTool = {
|
|
185
|
-
name: 'create_thing',
|
|
186
|
-
description: 'Create a new thing',
|
|
187
|
-
inputSchema: z.object({
|
|
188
|
-
name: z.string().describe('Thing name'),
|
|
189
|
-
data: z.preprocess(
|
|
190
|
-
(val) => typeof val === 'string' ? JSON.parse(val) : val,
|
|
191
|
-
z.record(z.any())
|
|
192
|
-
).optional().describe('Additional data as JSON')
|
|
193
|
-
}),
|
|
194
|
-
annotations: { toolGroup: 'WRITE' },
|
|
195
|
-
handler: async (args, context) => {
|
|
196
|
-
const result = await context.hailer.request('v3.thing.create', [{
|
|
197
|
-
workspaceId: context.workspaceId,
|
|
198
|
-
name: args.name,
|
|
199
|
-
...args.data
|
|
200
|
-
}]);
|
|
201
|
-
return {
|
|
202
|
-
content: [{
|
|
203
|
-
type: 'text',
|
|
204
|
-
text: JSON.stringify({ created: result._id }, null, 2)
|
|
205
|
-
}]
|
|
206
|
-
};
|
|
207
|
-
}
|
|
208
|
-
};
|
|
209
|
-
```
|
|
210
|
-
|
|
211
|
-
---
|
|
212
|
-
|
|
213
|
-
## Edit Mode Guard
|
|
214
|
-
|
|
215
|
-
Before editing MCP server code, enable edit mode:
|
|
216
|
-
|
|
217
|
-
```bash
|
|
218
|
-
# Enable editing
|
|
219
|
-
node .claude/hooks/src-edit-guard.cjs --on
|
|
220
|
-
|
|
221
|
-
# ... make edits ...
|
|
222
|
-
|
|
223
|
-
# Disable editing
|
|
224
|
-
node .claude/hooks/src-edit-guard.cjs --off
|
|
225
|
-
```
|
|
226
|
-
|
|
227
|
-
---
|
|
228
|
-
|
|
229
|
-
## Build Verification
|
|
230
|
-
|
|
231
|
-
Always verify build passes after changes:
|
|
232
|
-
|
|
233
|
-
```bash
|
|
234
|
-
npm run build
|
|
235
|
-
```
|
|
236
|
-
|
|
237
|
-
Tool is only complete when build passes without errors.
|
|
238
|
-
|
|
239
|
-
---
|
|
240
|
-
|
|
241
|
-
## Common Mistakes
|
|
242
|
-
|
|
243
|
-
| Wrong | Right |
|
|
244
|
-
|-------|-------|
|
|
245
|
-
| `z.number()` for MCP input | `z.coerce.number()` - values come as strings |
|
|
246
|
-
| `z.boolean()` for MCP input | `z.coerce.boolean()` |
|
|
247
|
-
| `z.array()` directly | `z.preprocess()` wrapper to parse JSON string |
|
|
248
|
-
| Forgetting to register tool | Add to `src/app.ts` tools array |
|
|
249
|
-
| Skipping build check | Always run `npm run build` |
|
|
250
|
-
| Using wrong tool group | READ for queries, WRITE for mutations |
|
|
@@ -1,126 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: tool-parameter-usage
|
|
3
|
-
description: Extract IDs from context and use correct parameter formats for Hailer tools
|
|
4
|
-
version: 1.1.0
|
|
5
|
-
triggers: Tool validation failed with "Required" error, empty receivedArgs, or field format errors
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
# Tool Parameter Usage
|
|
9
|
-
|
|
10
|
-
<purpose>
|
|
11
|
-
Teach correct extraction of IDs from message context and proper parameter formats for Hailer tool calls, preventing empty parameter errors and format mismatches.
|
|
12
|
-
</purpose>
|
|
13
|
-
|
|
14
|
-
<patterns>
|
|
15
|
-
## Pattern 1: Context Extraction
|
|
16
|
-
|
|
17
|
-
The `<incoming>` tag in messages contains critical IDs. ALWAYS extract and use them:
|
|
18
|
-
|
|
19
|
-
```xml
|
|
20
|
-
<incoming activityId="69384669b7826c5d9ec4e07c" discussionId="69384669b7826c5d9ec4e07d">
|
|
21
|
-
User message here
|
|
22
|
-
</incoming>
|
|
23
|
-
```
|
|
24
|
-
|
|
25
|
-
**Extract before calling tools:**
|
|
26
|
-
- `activityId` → use for `show_activity_by_id`, `update_activity`
|
|
27
|
-
- `discussionId` → use for `get_activity_from_discussion`, `add_discussion_message`
|
|
28
|
-
|
|
29
|
-
## Pattern 2: Single vs Bulk Mode Parameters
|
|
30
|
-
|
|
31
|
-
| Tool | Single mode | Bulk mode |
|
|
32
|
-
|------|-------------|-----------|
|
|
33
|
-
| `create_activity` | Top-level `name`, `phaseId`, `teamId`, `fields` | Inside each `activities[]` item |
|
|
34
|
-
| `update_activity` | `activityId` | `activities[]._id` |
|
|
35
|
-
| `show_activity_by_id` | `activityId` | N/A |
|
|
36
|
-
| `get_activity_from_discussion` | `discussionId` | N/A |
|
|
37
|
-
|
|
38
|
-
**CRITICAL for `create_activity` bulk mode:** `teamId`, `phaseId`, and `fields` must be **inside each activity object** in the `activities[]` array. Top-level values (except `workflowId`) are IGNORED in bulk mode. This causes "Missing team(s)" (code 127) if teamId is only at the top level.
|
|
39
|
-
|
|
40
|
-
## Pattern 3: Field Value Formats
|
|
41
|
-
|
|
42
|
-
| Field type | Value format |
|
|
43
|
-
|------------|--------------|
|
|
44
|
-
| `numericunit` | Plain number: `78` |
|
|
45
|
-
| `text` | Plain string: `"hello"` |
|
|
46
|
-
| `activitylink` | Activity ID string: `"abc123..."` |
|
|
47
|
-
| `select` | Option key: `"option_key"` |
|
|
48
|
-
|
|
49
|
-
**Never pass objects with `type` metadata** - Hailer API expects plain values.
|
|
50
|
-
</patterns>
|
|
51
|
-
|
|
52
|
-
<examples>
|
|
53
|
-
## Example 1: Correct - Extracting IDs from Context
|
|
54
|
-
|
|
55
|
-
```typescript
|
|
56
|
-
// Context: <incoming activityId="69384669b7826c5d9ec4e07c" discussionId="69384669b7826c5d9ec4e07d">
|
|
57
|
-
|
|
58
|
-
// CORRECT - Extract activityId from context
|
|
59
|
-
show_activity_by_id({
|
|
60
|
-
activityId: "69384669b7826c5d9ec4e07c"
|
|
61
|
-
});
|
|
62
|
-
|
|
63
|
-
// CORRECT - Get activity from discussion
|
|
64
|
-
get_activity_from_discussion({
|
|
65
|
-
discussionId: "69384669b7826c5d9ec4e07d"
|
|
66
|
-
});
|
|
67
|
-
```
|
|
68
|
-
|
|
69
|
-
## Example 2: Correct - Single vs Bulk Update Mode
|
|
70
|
-
|
|
71
|
-
```typescript
|
|
72
|
-
// CORRECT - Single update mode uses activityId
|
|
73
|
-
update_activity({
|
|
74
|
-
activityId: "69384669b7826c5d9ec4e07c",
|
|
75
|
-
fields: { "fieldId123": 78 }
|
|
76
|
-
});
|
|
77
|
-
|
|
78
|
-
// CORRECT - Bulk update mode uses _id (NOT activityId)
|
|
79
|
-
update_activity({
|
|
80
|
-
activities: [{
|
|
81
|
-
_id: "69384669b7826c5d9ec4e07c",
|
|
82
|
-
fields: { "fieldId123": 78 }
|
|
83
|
-
}]
|
|
84
|
-
});
|
|
85
|
-
```
|
|
86
|
-
|
|
87
|
-
## Example 3: Correct - Field Value Formats
|
|
88
|
-
|
|
89
|
-
```typescript
|
|
90
|
-
// CORRECT - numericunit field = plain number
|
|
91
|
-
update_activity({
|
|
92
|
-
activityId: "69384669b7826c5d9ec4e07c",
|
|
93
|
-
fields: { "weightFieldId": 78 }
|
|
94
|
-
});
|
|
95
|
-
```
|
|
96
|
-
|
|
97
|
-
## Example 4: Wrong - Common Errors
|
|
98
|
-
|
|
99
|
-
```typescript
|
|
100
|
-
// WRONG - Empty parameters (ignoring context)
|
|
101
|
-
show_activity_by_id({});
|
|
102
|
-
// Error: activityId: Required, receivedArgs={}
|
|
103
|
-
|
|
104
|
-
// WRONG - Using activityId in bulk mode (should be _id)
|
|
105
|
-
update_activity({
|
|
106
|
-
activities: [{
|
|
107
|
-
activityId: "69384669b7826c5d9ec4e07c", // WRONG KEY
|
|
108
|
-
fields: { "fieldId123": 78 }
|
|
109
|
-
}]
|
|
110
|
-
});
|
|
111
|
-
// Error: activities.0._id: Required
|
|
112
|
-
|
|
113
|
-
// WRONG - Passing object for numericunit field
|
|
114
|
-
update_activity({
|
|
115
|
-
activityId: "69384669b7826c5d9ec4e07c",
|
|
116
|
-
fields: {
|
|
117
|
-
"weightFieldId": { "type": "numericunit", "value": 78 } // WRONG FORMAT
|
|
118
|
-
}
|
|
119
|
-
});
|
|
120
|
-
// Error: "Weight" must be a number
|
|
121
|
-
|
|
122
|
-
// WRONG - Empty list_activities call
|
|
123
|
-
list_activities({});
|
|
124
|
-
// Error: workflowId: Required, phaseId: Required
|
|
125
|
-
```
|
|
126
|
-
</examples>
|
|
@@ -1,92 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: tool-response-verification
|
|
3
|
-
description: Verify MCP tool execution results before reporting success
|
|
4
|
-
version: 1.0.0
|
|
5
|
-
triggers:
|
|
6
|
-
- MCP tool failure
|
|
7
|
-
- fabricated response
|
|
8
|
-
- tool result verification
|
|
9
|
-
- silent failure
|
|
10
|
-
- disconnected server
|
|
11
|
-
---
|
|
12
|
-
|
|
13
|
-
# Tool Response Verification
|
|
14
|
-
|
|
15
|
-
<purpose>
|
|
16
|
-
Ensure agents verify actual tool execution results before reporting success, preventing fabricated responses when MCP servers are disconnected or tools fail silently.
|
|
17
|
-
</purpose>
|
|
18
|
-
|
|
19
|
-
<patterns>
|
|
20
|
-
## Pattern 1: Always Check Tool Results
|
|
21
|
-
|
|
22
|
-
Every MCP tool call returns a result. Read it before proceeding.
|
|
23
|
-
|
|
24
|
-
## Pattern 2: Never Assume Success
|
|
25
|
-
|
|
26
|
-
If you didn't see confirmation in the result, it didn't happen.
|
|
27
|
-
|
|
28
|
-
## Pattern 3: Report Actual Errors
|
|
29
|
-
|
|
30
|
-
If tool returned error, report error status - don't fabricate success.
|
|
31
|
-
|
|
32
|
-
## Pattern 4: No Fabrication
|
|
33
|
-
|
|
34
|
-
Never claim "created 5 activities" if you didn't see 5 activity IDs returned.
|
|
35
|
-
|
|
36
|
-
## Pattern 5: Verification Checklist
|
|
37
|
-
|
|
38
|
-
Before returning success:
|
|
39
|
-
- Did the tool return a result (not an error)?
|
|
40
|
-
- Does the result contain expected data (IDs, counts, etc.)?
|
|
41
|
-
- Am I reporting data FROM the result, not data I expected?
|
|
42
|
-
|
|
43
|
-
## Pattern 6: Detect MCP Connection Errors
|
|
44
|
-
|
|
45
|
-
When an MCP server is offline, tools return empty results, undefined data, or error messages instead of clear failures. This looks like "success" but is actually a connection problem.
|
|
46
|
-
|
|
47
|
-
**Red flags:**
|
|
48
|
-
- Empty array when data is expected (e.g., `workflows: []` for a non-empty workspace)
|
|
49
|
-
- Missing schema fields that should always be present
|
|
50
|
-
- Undefined/null responses from tools that normally return structured data
|
|
51
|
-
- Error messages containing: "connection", "ECONNREFUSED", "timeout", "unavailable", "ENOTFOUND"
|
|
52
|
-
|
|
53
|
-
**What to do:**
|
|
54
|
-
Instead of reporting empty data as success, report: "MCP server appears offline - tool returned empty/error result. Check that the MCP server is running."
|
|
55
|
-
|
|
56
|
-
Return error status, not success:
|
|
57
|
-
```json
|
|
58
|
-
{
|
|
59
|
-
"status": "error",
|
|
60
|
-
"result": { "tool": "tool_name", "error": "MCP server appears offline" },
|
|
61
|
-
"summary": "Cannot proceed: MCP server not responding"
|
|
62
|
-
}
|
|
63
|
-
```
|
|
64
|
-
</patterns>
|
|
65
|
-
|
|
66
|
-
<examples>
|
|
67
|
-
## Example 1: Correct - Verify Before Reporting
|
|
68
|
-
|
|
69
|
-
```
|
|
70
|
-
GOOD: Call create_activity → read result → if result.activityId exists → return success
|
|
71
|
-
GOOD: "Created customer with ID abc123" (ID from actual result)
|
|
72
|
-
```
|
|
73
|
-
|
|
74
|
-
## Example 2: Wrong - Fabricating Success
|
|
75
|
-
|
|
76
|
-
```
|
|
77
|
-
BAD: Call create_activity → immediately return {"status": "success", "created": 1}
|
|
78
|
-
BAD: "I created the customer" (without checking result)
|
|
79
|
-
```
|
|
80
|
-
|
|
81
|
-
## Example 3: Correct - Error Reporting
|
|
82
|
-
|
|
83
|
-
When tools fail, report the actual error:
|
|
84
|
-
|
|
85
|
-
```json
|
|
86
|
-
{
|
|
87
|
-
"status": "error",
|
|
88
|
-
"result": { "tool": "tool_name", "error": "actual error message" },
|
|
89
|
-
"summary": "Tool failed: brief reason"
|
|
90
|
-
}
|
|
91
|
-
```
|
|
92
|
-
</examples>
|