// estate-sales MCP server — sales-progression chain tools (Task 1372). // // Five tools, all admin + negotiator side (none exposed on the public agent): // progression-chain-upsert write (Sale + Chain + ordered links + parties) // progression-milestone-set write (one milestone date on one link) // progression-chain-read query (full state-of-chain for one deal) // progression-pipeline-list query (active sale-agreed pipeline + stall flags) // progression-party-lookup query (inbound contact -> chain + link + role) // // Writes use raw parameterised cypher via a local neo4j driver, account-scoped // with the parent edge attached in the same statement (buyers/mcp pattern). import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"; import { closeDriver } from "./lib/neo4j.js"; import { registerChainUpsert } from "./tools/progression-chain-upsert.js"; import { registerMilestoneSet } from "./tools/progression-milestone-set.js"; import { registerChainRead } from "./tools/progression-chain-read.js"; import { registerPipelineList } from "./tools/progression-pipeline-list.js"; import { registerPartyLookup } from "./tools/progression-party-lookup.js"; const accountId = process.env.ACCOUNT_ID ?? "local"; const server = new McpServer({ name: "maxy-estate-sales", version: "0.1.0" }); console.error(`[estate-sales] server started, account=${accountId}`); registerChainUpsert(server, accountId); registerMilestoneSet(server, accountId); registerChainRead(server, accountId); registerPipelineList(server, accountId); registerPartyLookup(server, accountId); const transport = new StdioServerTransport(); await server.connect(transport); async function shutdown(): Promise { await closeDriver(); process.exit(0); } process.on("SIGINT", shutdown); process.on("SIGTERM", shutdown);