@slamb2k/dvx 1.0.7

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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/mcp/server.ts","../src/mcp/meta-tools.ts","../src/mcp/dynamic-tools.ts"],"sourcesContent":["import { randomUUID } from 'node:crypto'\nimport { text } from 'node:stream/consumers'\nimport { Server } from '@modelcontextprotocol/sdk/server/index.js'\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'\nimport { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js'\nimport { CallToolRequestSchema, ListToolsRequestSchema } from '@modelcontextprotocol/sdk/types.js'\nimport { createClient } from '../client/create-client.js'\nimport { getMetaToolDefinitions, handleMetaTool } from './meta-tools.js'\nimport { buildEntityToolDefinitions, handleEntityTool, ENTITY_TOOL_PREFIXES } from './dynamic-tools.js'\nimport { ValidationError } from '../errors.js'\n\nconst META_TOOL_NAMES = new Set(['discover_entity', 'list_entities', 'execute_query', 'execute_action', 'batch_execute'])\n\nasync function parseBody(req: import('node:http').IncomingMessage): Promise<unknown> {\n try {\n const body = await text(req)\n return JSON.parse(body)\n } catch {\n return undefined\n }\n}\n\nfunction createMcpServer(\n client: Awaited<ReturnType<typeof createClient>>['client'],\n entitySchemas: Awaited<ReturnType<typeof client.getEntitySchema>>[],\n): Server {\n const server = new Server(\n { name: 'dvx', version: '0.1.0' },\n { capabilities: { tools: {} } },\n )\n\n const { tools: entityTools, entitySetMap } = buildEntityToolDefinitions(entitySchemas)\n const allTools = [\n ...getMetaToolDefinitions(),\n ...entityTools,\n ]\n\n server.setRequestHandler(ListToolsRequestSchema, async () => ({ tools: allTools }))\n\n server.setRequestHandler(CallToolRequestSchema, async (request) => {\n const { name, arguments: args } = request.params\n const safeArgs = (args ?? {}) as Record<string, unknown>\n\n if (META_TOOL_NAMES.has(name)) {\n return handleMetaTool(name, safeArgs, client)\n }\n\n if (ENTITY_TOOL_PREFIXES.some((p) => name.startsWith(p))) {\n return handleEntityTool(name, safeArgs, client, entitySetMap)\n }\n\n throw new ValidationError(`Unknown tool: ${name}`)\n })\n\n return server\n}\n\nexport async function startMcpServer(opts: { entities?: string[]; transport?: 'stdio' | 'http'; port?: number }): Promise<void> {\n const { client } = await createClient()\n\n const entitySchemas = opts.entities\n ? await Promise.all(opts.entities.map((e) => client.getEntitySchema(e)))\n : []\n\n if (opts.transport === 'http') {\n const { createServer } = await import('node:http')\n const port = opts.port ?? 3000\n\n const sessions = new Map<string, { transport: StreamableHTTPServerTransport; server: Server }>()\n\n const httpServer = createServer(async (req, res) => {\n if (req.method === 'GET' && req.url === '/health') {\n res.writeHead(200, { 'Content-Type': 'application/json' })\n res.end(JSON.stringify({ ok: true }))\n return\n }\n\n const sessionId = req.headers['mcp-session-id'] as string | undefined\n\n if (req.method === 'DELETE' && req.url === '/mcp') {\n if (sessionId && sessions.has(sessionId)) {\n const session = sessions.get(sessionId)!\n await session.transport.close()\n sessions.delete(sessionId)\n }\n res.writeHead(204)\n res.end()\n return\n }\n\n if (sessionId && sessions.has(sessionId)) {\n const session = sessions.get(sessionId)!\n await session.transport.handleRequest(req, res, await parseBody(req))\n return\n }\n\n // Initialization path: create a new Server and transport for this session\n const mcpServer = createMcpServer(client, entitySchemas)\n\n const transport = new StreamableHTTPServerTransport({\n sessionIdGenerator: () => randomUUID(),\n onsessioninitialized: (sid) => {\n sessions.set(sid, { transport, server: mcpServer })\n },\n onsessionclosed: (sid) => {\n sessions.delete(sid)\n },\n })\n\n // Type assertion needed: StreamableHTTPServerTransport's optional callback\n // properties are not compatible with Transport under exactOptionalPropertyTypes\n await mcpServer.connect(transport as Parameters<typeof mcpServer.connect>[0])\n await transport.handleRequest(req, res, await parseBody(req))\n })\n\n httpServer.listen(port, () => {\n console.error(`dvx MCP HTTP server listening on port ${port}`)\n console.error('Stateful session mode — SSE subscriptions and batch progress streaming are supported.')\n })\n return\n }\n\n // stdio (existing path)\n const server = createMcpServer(client, entitySchemas)\n const transport = new StdioServerTransport()\n await server.connect(transport)\n}\n","import type { Tool } from '@modelcontextprotocol/sdk/types.js'\nimport type { DataverseClient } from '../client/dataverse-client.js'\nimport { buildBatchBody, type BatchOperation } from '../utils/batch-builder.js'\nimport { ValidationError } from '../errors.js'\n\nexport function getMetaToolDefinitions(): Tool[] {\n return [\n {\n name: 'discover_entity',\n description: 'Fetch schema for a Dataverse entity by logical name',\n inputSchema: {\n type: 'object',\n properties: {\n entity_name: { type: 'string', description: 'Logical name of the entity' },\n },\n required: ['entity_name'],\n },\n },\n {\n name: 'list_entities',\n description: 'List all Dataverse entity logical names',\n inputSchema: { type: 'object', properties: {} },\n },\n {\n name: 'execute_query',\n description: 'Execute an OData or FetchXML query against Dataverse',\n inputSchema: {\n type: 'object',\n properties: {\n entity: { type: 'string', description: 'Entity logical name (required for fetchxml)' },\n odata: { type: 'string', description: 'OData query string (entitySetName?$filter=...)' },\n fetchxml: { type: 'string', description: 'FetchXML query string' },\n },\n },\n },\n {\n name: 'execute_action',\n description: 'Execute a Dataverse custom action or SDK message',\n inputSchema: {\n type: 'object',\n properties: {\n name: { type: 'string', description: 'Action name (PascalCase)' },\n payload: { type: 'object', description: 'Action input parameters' },\n entity: { type: 'string', description: 'Entity logical name for bound actions' },\n id: { type: 'string', description: 'Record GUID for bound actions' },\n },\n required: ['name', 'payload'],\n },\n },\n {\n name: 'batch_execute',\n description: 'Execute multiple Dataverse operations in a single batch request',\n inputSchema: {\n type: 'object',\n properties: {\n operations: {\n type: 'array',\n items: {\n type: 'object',\n properties: {\n method: { type: 'string', enum: ['GET', 'POST', 'PATCH', 'DELETE'] },\n path: { type: 'string' },\n body: { type: 'object' },\n },\n required: ['method', 'path'],\n },\n },\n atomic: { type: 'boolean', description: 'Wrap in changeset for transactional semantics' },\n },\n required: ['operations'],\n },\n },\n ]\n}\n\nexport async function handleMetaTool(\n name: string,\n args: Record<string, unknown>,\n client: DataverseClient,\n): Promise<{ content: Array<{ type: 'text'; text: string }> }> {\n let result: unknown\n\n switch (name) {\n case 'discover_entity': {\n result = await client.getEntitySchema(args['entity_name'] as string)\n break\n }\n case 'list_entities': {\n result = await client.listEntities()\n break\n }\n case 'execute_query': {\n if (args['odata']) {\n const odata = args['odata'] as string\n const qIndex = odata.indexOf('?')\n const entitySetName = qIndex >= 0 ? odata.slice(0, qIndex) : odata\n const queryString = qIndex >= 0 ? odata.slice(qIndex + 1) : ''\n result = await client.query(entitySetName, queryString, { pageAll: true })\n } else if (args['fetchxml']) {\n if (!args['entity']) throw new ValidationError('entity is required for fetchxml queries')\n const entityName = args['entity'] as string\n const records: unknown[] = []\n await client.queryFetchXml(entityName, args['fetchxml'] as string, (record) => {\n records.push(record)\n })\n result = records\n } else {\n throw new ValidationError('Either odata or fetchxml must be provided')\n }\n break\n }\n case 'execute_action': {\n result = await client.executeAction(\n args['name'] as string,\n (args['payload'] ?? {}) as Record<string, unknown>,\n { entityName: args['entity'] as string | undefined, id: args['id'] as string | undefined },\n )\n break\n }\n case 'batch_execute': {\n const operations = args['operations'] as BatchOperation[]\n const atomic = Boolean(args['atomic'])\n const boundary = `batch_dvx_mcp_${Date.now()}`\n const body = buildBatchBody(operations, boundary, { atomic })\n result = await client.executeBatch(body, boundary)\n break\n }\n default:\n throw new ValidationError(`Unknown meta-tool: ${name}`)\n }\n\n return { content: [{ type: 'text', text: JSON.stringify(result) }] }\n}\n","import type { Tool } from '@modelcontextprotocol/sdk/types.js'\nimport type { DataverseClient } from '../client/dataverse-client.js'\nimport type { EntitySchemaCacheEntry } from '../schema/schema-cache.js'\nimport { ValidationError } from '../errors.js'\n\nexport const ENTITY_TOOL_PREFIXES = ['create_', 'update_', 'get_', 'query_'] as const\n\nexport function buildEntityToolDefinitions(schemas: EntitySchemaCacheEntry[]): {\n tools: Tool[]\n entitySetMap: Map<string, string>\n} {\n const tools: Tool[] = []\n const entitySetMap = new Map<string, string>()\n for (const schema of schemas) {\n const { logicalName, entitySetName, attributes } = schema\n\n entitySetMap.set(logicalName, entitySetName)\n\n const attrProps: Record<string, { type: string; description?: string }> = {}\n for (const attr of attributes) {\n attrProps[attr.logicalName] = { type: 'string', description: attr.displayName }\n }\n\n tools.push(\n {\n name: `create_${logicalName}`,\n description: `Create a new ${logicalName} record`,\n inputSchema: { type: 'object', properties: attrProps },\n },\n {\n name: `update_${logicalName}`,\n description: `Update an existing ${logicalName} record`,\n inputSchema: {\n type: 'object',\n properties: { id: { type: 'string', description: 'Record GUID' }, ...attrProps },\n required: ['id'],\n },\n },\n {\n name: `get_${logicalName}`,\n description: `Get a ${logicalName} record by ID`,\n inputSchema: {\n type: 'object',\n properties: {\n id: { type: 'string', description: 'Record GUID' },\n fields: { type: 'string', description: 'Comma-separated field names' },\n },\n required: ['id'],\n },\n },\n {\n name: `query_${logicalName}`,\n description: `Query ${logicalName} records with OData filter`,\n inputSchema: {\n type: 'object',\n properties: {\n filter: { type: 'string', description: 'OData filter expression' },\n fields: { type: 'string', description: 'Comma-separated field names' },\n top: { type: 'number', description: 'Max records to return' },\n },\n },\n },\n )\n }\n return { tools, entitySetMap }\n}\n\nexport async function handleEntityTool(\n name: string,\n args: Record<string, unknown>,\n client: DataverseClient,\n entitySetMap?: Map<string, string>,\n): Promise<{ content: Array<{ type: 'text'; text: string }> }> {\n const prefixes = [...ENTITY_TOOL_PREFIXES]\n const prefix = prefixes.find((p) => name.startsWith(p))\n if (!prefix) throw new ValidationError(`Unknown entity tool: ${name}`)\n\n const entityName = name.slice(prefix.length)\n let result: unknown\n\n switch (prefix) {\n case 'create_': {\n result = await client.createRecord(entityName, args as Record<string, unknown>)\n break\n }\n case 'update_': {\n const { id, ...payload } = args\n result = await client.updateRecord(entityName, id as string, payload as Record<string, unknown>)\n break\n }\n case 'get_': {\n const fields = (args['fields'] as string | undefined)?.split(',').map((f) => f.trim())\n result = await client.getRecord(entityName, args['id'] as string, fields)\n break\n }\n case 'query_': {\n const resolvedEntitySetName = entitySetMap?.get(entityName)\n ?? (await client.getEntitySchema(entityName)).entitySetName\n const parts: string[] = []\n if (args['filter']) parts.push(`$filter=${args['filter'] as string}`)\n if (args['fields']) parts.push(`$select=${args['fields'] as string}`)\n if (args['top']) parts.push(`$top=${args['top'] as number}`)\n const queryString = parts.join('&')\n result = await client.query(resolvedEntitySetName, queryString, { pageAll: true })\n break\n }\n }\n\n return { content: [{ type: 'text', text: JSON.stringify(result) }] }\n}\n"],"mappings":"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","names":["transport"]}
package/package.json ADDED
@@ -0,0 +1,51 @@
1
+ {
2
+ "name": "@slamb2k/dvx",
3
+ "version": "1.0.7",
4
+ "description": "Agent-first CLI and MCP server for Microsoft Dataverse CE/Sales/Service",
5
+ "type": "module",
6
+ "bin": {
7
+ "dvx": "./dist/index.js"
8
+ },
9
+ "files": [
10
+ "dist"
11
+ ],
12
+ "publishConfig": {
13
+ "access": "public"
14
+ },
15
+ "engines": {
16
+ "node": ">=18"
17
+ },
18
+ "keywords": [
19
+ "dataverse",
20
+ "dynamics365",
21
+ "mcp",
22
+ "cli"
23
+ ],
24
+ "license": "MIT",
25
+ "dependencies": {
26
+ "@azure/msal-node": "^2.16.0",
27
+ "@clack/prompts": "^1.1.0",
28
+ "@microsoft/microsoft-graph-client": "^3.0.7",
29
+ "@modelcontextprotocol/sdk": "^1.0.0",
30
+ "better-sqlite3": "^12.6.2",
31
+ "commander": "^12.1.0",
32
+ "fast-xml-parser": "^5.4.2",
33
+ "zod": "^3.23.0"
34
+ },
35
+ "devDependencies": {
36
+ "@types/better-sqlite3": "^7.6.13",
37
+ "@types/node": "^20.11.0",
38
+ "tsup": "^8.3.0",
39
+ "typescript": "^5.7.0",
40
+ "vitest": "^2.1.0"
41
+ },
42
+ "scripts": {
43
+ "build": "tsup",
44
+ "dev": "tsup --watch",
45
+ "test": "vitest run",
46
+ "test:watch": "vitest",
47
+ "typecheck": "tsc --noEmit",
48
+ "lint": "tsc --noEmit",
49
+ "postinstall": "node -e \"console.error('\\n dvx installed. Run: dvx auth login --help\\n')\""
50
+ }
51
+ }