@ductape/mcp 0.2.23 → 0.2.24
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/dist/index.js +56 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -5433,11 +5433,66 @@ function handleCliFlags() {
|
|
|
5433
5433
|
}
|
|
5434
5434
|
return false;
|
|
5435
5435
|
}
|
|
5436
|
+
// Surfaced to every connected agent at initialize time, before any tool is called.
|
|
5437
|
+
// Keep this short — it is ambient, unconditional overhead on every session.
|
|
5438
|
+
// The full doctrine with concrete API shapes lives in the "ductape-first-approach" prompt below.
|
|
5439
|
+
const DUCTAPE_FIRST_INSTRUCTIONS = 'Ductape-first: before writing custom code for a capability, check whether Ductape already ' +
|
|
5440
|
+
'provides it (databases, storage, notifications, events, sessions, caches, actions, quotas, ' +
|
|
5441
|
+
'fallback, health). Model any multi-step or externally-risky operation as a Feature ' +
|
|
5442
|
+
'(features.define + ctx.step) instead of an ad-hoc function chain — Features get durable ' +
|
|
5443
|
+
'steps, retries, and compensation for free. Route any call to an unreliable or swappable ' +
|
|
5444
|
+
'external provider (payment, email/SMS, any third-party API) through a Quota or Fallback with ' +
|
|
5445
|
+
'2+ providers instead of one hardcoded call. Gate risky dependencies with Healthchecks. Treat ' +
|
|
5446
|
+
'the ductape/ folder (features/, database/schema.json, notifications.json, events/) as the ' +
|
|
5447
|
+
'source of truth: define there first, sync/apply, then write application code against it — ' +
|
|
5448
|
+
'never the reverse. Invoke the "ductape-first-approach" prompt for the full doctrine with ' +
|
|
5449
|
+
'concrete API shapes before scaffolding a new backend.';
|
|
5450
|
+
// The detailed doctrine, invoked on demand via the "ductape-first-approach" prompt rather than
|
|
5451
|
+
// forced onto every session. Grounded in the actual module contracts this server exposes
|
|
5452
|
+
// (features, quotas, fallback, health, jobs) — keep it in sync with ductape_docs topics.
|
|
5453
|
+
const DUCTAPE_FIRST_DOCTRINE = 'Follow this checklist before defaulting to plain CRUD when building on Ductape.\n\n' +
|
|
5454
|
+
'1. Multi-step or side-effecting work (payments, order fulfillment, onboarding, anything with ' +
|
|
5455
|
+
'a failure mode) -> define a Feature (features.define) with one ctx.step per stage and a ' +
|
|
5456
|
+
'rollback/compensation callback where undoing matters. Execute it with features.execute, not a ' +
|
|
5457
|
+
'plain function call chain. Call ductape_docs({ topic: "features" }) for the full contract.\n\n' +
|
|
5458
|
+
'2. Any call to an external or swappable provider (payment gateway, email/SMS/push provider, ' +
|
|
5459
|
+
'any third-party API) -> define a Quota (quotas.create) or Fallback (fallback.create) with at ' +
|
|
5460
|
+
'least two provider options instead of one hardcoded ductape.api.run call. Gate the provider ' +
|
|
5461
|
+
'with a Healthcheck (health.create) so a down dependency is caught before it fails a user ' +
|
|
5462
|
+
'request, not after. Call ductape_docs({ topic: "resilience" }) for the exact shapes.\n\n' +
|
|
5463
|
+
'3. Recurring or scheduled work -> use Jobs (jobs.create), not application-level cron or ' +
|
|
5464
|
+
'setInterval.\n\n' +
|
|
5465
|
+
'4. The ductape/ folder is the fulcrum, not an afterthought: ductape/features/*.ts + ' +
|
|
5466
|
+
'"ductape features sync", ductape/database/schema.json + "ductape db schema generate/migrate", ' +
|
|
5467
|
+
'ductape/notifications.json + "ductape apply notifications", ductape/events/*.topic.json + ' +
|
|
5468
|
+
'"ductape apply events". Define the capability there first, then write application code that ' +
|
|
5469
|
+
'calls into it — never duplicate the logic inline.\n\n' +
|
|
5470
|
+
'5. Before scaffolding any new resource, run ductape_schema to see the exact required fields, ' +
|
|
5471
|
+
'and ductape_cli("products components list --product-tag <tag> --json") to see what already ' +
|
|
5472
|
+
'exists so you extend rather than re-create.\n\n' +
|
|
5473
|
+
'Default assumption for any backend built through this MCP server: orchestration goes through ' +
|
|
5474
|
+
'Features, provider risk goes through Quotas/Fallback, and the ductape/ folder is what ships — ' +
|
|
5475
|
+
'not a database table and a CRUD wrapper.';
|
|
5436
5476
|
async function main() {
|
|
5437
5477
|
const { McpServer, StdioServerTransport } = await loadMcpSdk();
|
|
5438
5478
|
const { version: mcpVersion } = createRequire(import.meta.url)('../package.json');
|
|
5439
|
-
const server = new McpServer({ name: 'ductape-mcp', version: mcpVersion });
|
|
5479
|
+
const server = new McpServer({ name: 'ductape-mcp', version: mcpVersion }, { instructions: DUCTAPE_FIRST_INSTRUCTIONS });
|
|
5440
5480
|
const transport = new StdioServerTransport();
|
|
5481
|
+
server.registerPrompt('ductape-first-approach', {
|
|
5482
|
+
title: 'Ductape-first approach',
|
|
5483
|
+
description: 'Load the Ductape-first doctrine before building: when to reach for Features, ' +
|
|
5484
|
+
'Quotas/Fallback, Healthchecks, and the ductape/ folder instead of plain CRUD or ad-hoc ' +
|
|
5485
|
+
'glue code.',
|
|
5486
|
+
argsSchema: {},
|
|
5487
|
+
}, async (_args, _extra) => ({
|
|
5488
|
+
description: 'How to approach building with Ductape',
|
|
5489
|
+
messages: [
|
|
5490
|
+
{
|
|
5491
|
+
role: 'user',
|
|
5492
|
+
content: { type: 'text', text: DUCTAPE_FIRST_DOCTRINE },
|
|
5493
|
+
},
|
|
5494
|
+
],
|
|
5495
|
+
}));
|
|
5441
5496
|
const cliHandler = async (args) => {
|
|
5442
5497
|
const cli = checkCli();
|
|
5443
5498
|
if (!cli.available) {
|