MarketSharp

io.github.WYRE-AI由 GitHub 账号 WYRE-AI 发布v1.0.0更新于 Nov 11, 2026

MCP server for MarketSharp CRM contacts, inquiries, appointments, jobs, notes and activities.

已验证STDIO仅桌面数据与分析商业与电商

概览

AI 生成的概览

只读的 MCP 服务器,让助手访问 MarketSharp CRM 的联系人、询盘、预约、工单、备注和参考列表。

可以做什么
  • 查询公司与跨联系人、询盘、工单的全局搜索
  • 读取和搜索联系人,包括 QuickFind 与分页筛选列表
  • 读取询盘及其状态、备注和产品意向
  • 读取预约、预约结果与工单,以及含合同总额的商机列表
  • 读取备注、活动类型、员工、线索来源和部门
适用场景
当助手需要回答关于承包商在 MarketSharp 中的线索、预约、工单或客户记录的问题,或在不改动任何数据的前提下汇总销售管道与商机数据时适用。
运行要求
以 stdio 在本地运行;需要 Node.js 22 或更高版本,或使用已发布的容器镜像。需要 MARKETSHARP_COMPANY_ID、MARKETSHARP_API_KEY 和 MARKETSHARP_API_SECRET;镜像还需 MCP_TRANSPORT=stdio 与 AUTH_MODE=env。MARKETSHARP_EMPLOYEE_ID 可选,但联系人、询盘、工单搜索工具和备注列表需要它。需能访问 MarketSharp REST API。
安装前请注意
需要 MarketSharp API 密钥和密钥口令,二者均为机密;建议使用专为 API 访问设置的员工账号而非个人登录。全部 25 个工具均为只读,不会创建、修改或删除数据。工具输出是客户录入的 CRM 数据,会被标记为不可信内容。部署时切勿设置 MCP_ALLOW_INSECURE_DEV。

安装

在 SourceWeft 中

  1. 打开 控制台中的 MarketSharp,将其添加到工作区。
  2. 为需要使用其工具的对话启用该服务。

Desktop only,通过 STDIO。 STDIO 服务会启动本地进程,因此需要 SourceWeft 桌面宿主。

其他 MCP 客户端

参照 仓库 中的启动说明。

README

marketsharp-mcp

MCP server for the MarketSharp CRM REST API (https://restapi.marketsharpm.com, API version 2.0). It gives an AI assistant read access to a home-improvement contractor's contacts, inquiries (leads), appointments, jobs, notes and reference lists. Every tool is read-only.

Maintained by WYRE AI. It runs as a stdio server locally or as a stateless Streamable HTTP server behind a gateway.

Credentials

MarketSharp uses application authentication: the server exchanges your Company ID, API key and API secret at POST /token for a short-lived bearer token, caches it per credential set, and refreshes it on expiry or a 401.

VariableGateway headerRequiredWhere to find it
MARKETSHARP_COMPANY_IDx-marketsharp-company-idyesShown under your username, top right in MarketSharp
MARKETSHARP_API_KEYx-marketsharp-api-keyyesAdmin → Apps & Add-ons Setup → API maintenance → Create New API Key
MARKETSHARP_API_SECRETx-marketsharp-api-secretyesIssued with the API key. If there's no secret, MarketSharp support has to turn on API access
MARKETSHARP_EMPLOYEE_IDx-marketsharp-employee-idnoMarketSharp employee ID. The contact, inquiry and job search tools, and marketsharp_notes_list need it, and act with that employee's permissions

Use a dedicated MarketSharp employee set up for API access rather than a person's login. The server never uses MarketSharp usernames or passwords.

Tools (25, all read-only)

ToolMarketSharp endpoint
marketsharp_companies_listGET /companies
marketsharp_companies_getGET /companies/{companyId}
marketsharp_search_globalPOST …/search/global (contacts, inquiries, jobs)
marketsharp_contacts_getGET …/contacts/{contactId}
marketsharp_contacts_searchPOST …/contacts/search (QuickFind, needs employee)
marketsharp_contacts_listPOST …/contacts/filter (paged, modified-since / appointment window)
marketsharp_inquiries_getGET …/inquiries/{inquiryId} (optional isAppointmentRequired; MarketSharp defaults it to true)
marketsharp_inquiries_listPOST …/inquiries/filter (paged; optional isAppointmentRequired, which MarketSharp defaults to true)
marketsharp_inquiries_searchPOST …/inquiries/search (QuickFind, needs employee)
marketsharp_inquiries_list_by_contactGET …/contacts/{contactId}/inquiries (optional isAppointmentRequired)
marketsharp_inquiry_statuses_listGET …/inquiries/statuses
marketsharp_inquiry_notes_listGET …/opportunities/{inquiryId}/notes/{Inquiry|Job} (needs View Opportunity Note)
marketsharp_appointments_getGET …/appointments/{appointmentId}
marketsharp_appointments_listPOST …/appointments/filter (paged)
marketsharp_appointments_list_by_contactGET …/appointments/contacts/{contactId}
marketsharp_appointment_results_listGET …/appointments/results/active or resultreasons/active
marketsharp_jobs_getGET …/jobs/{jobId}
marketsharp_jobs_searchPOST …/jobs/search (QuickFind, needs employee)
marketsharp_opportunities_listPOST …/jobs/opportunities (jobs + leads since a date, contract totals; needs View Opportunity)
marketsharp_notes_listGET …/notes/contact/{contactId} or by note type (needs employee)
marketsharp_activity_types_listGET …/activities/types
marketsharp_employees_listGET …/employees (paged)
marketsharp_lead_sources_listGET …/primaryleadsources[/…/secondaryleadsources]
marketsharp_product_interests_listGET …/products/interests/{activeOnly} or per inquiry (needs View Product Interest)
marketsharp_divisions_listGET …/divisions

There are no create, update or delete tools. Searches and filtered lists use POST because that is how MarketSharp exposes them; they don't change data. The client only sends the GET and POST routes these tools use (an allowlist of route templates in src/client.ts). Any other request, including a GET no tool uses, is refused before sign-in.

Running

Requires Node.js 22 or later.

bash
npm ci && npm run buildMARKETSHARP_COMPANY_ID=… MARKETSHARP_API_KEY=… MARKETSHARP_API_SECRET=… node dist/index.js   # stdio

The Docker image defaults to MCP_TRANSPORT=http and AUTH_MODE=gateway. To run the image over stdio with MARKETSHARP_* credentials, pass -e MCP_TRANSPORT=stdio -e AUTH_MODE=env as well; otherwise it fails closed with "credentials are not configured".

HTTP (MCP_TRANSPORT=http, /mcp + /health) refuses to start without a real CONDUIT_S2S_SECRET (at least 32 characters, not a known or placeholder-looking value, not a repeated pattern, at least 8 distinct characters) and requires a valid X-Gateway-S2S header on every /mcp request. /mcp takes POST only (405 with Allow: POST otherwise). MCP_ALLOWED_HOSTS (comma-separated, off when unset) limits the Host headers /mcp accepts. Every response sets Cache-Control: no-store.

  • AUTH_MODE is gateway (the default when unset) or env. Any other value refuses to start. In gateway mode credentials come only from the x-marketsharp-* headers; MARKETSHARP_* env is never read. env is for a single tenant and reads MARKETSHARP_* from the environment; over HTTP it refuses to start unless the company id, API key and API secret are set and the ids look like MarketSharp ids. Stdio uses the environment only when AUTH_MODE is unset or exactly env; any other value (including a typo) is treated as gateway, so env credentials are never used by mistake.
  • Tool tiers: read is the only tier. Conduit's X-Conduit-Tool-Tiers header can only narrow that set for one request. A present but empty header means no tools at all. Unlike the fleet template there is deliberately no MARKETSHARP_TOOL_TIERS variable: with one tier there is nothing to choose, and nothing in the environment can change the tier set.
  • Every request goes to the fixed host https://restapi.marketsharpm.com at exactly the path that was built. Ids in paths must look like MarketSharp ids (1-64 letters, digits or dashes, which covers numbers and GUIDs); anything else is rejected before any request. Redirects are refused (redirect: 'manual', any 3xx is an error), so the bearer token never leaves the host. Response bodies are read with a 4 MiB cap.
  • Tool output, tool errors and log lines are redacted: the API key and secret in use (env or per request), bearer tokens and JWTs become [REDACTED]. In MarketSharp responses, values under credential-named keys (apiKey, authorization, token, accessToken, refreshToken, and any key ending in password or secret) are redacted too. Arguments a tool doesn't declare are dropped before it runs. Vendor errors keep the HTTP status, MarketSharp's message and, when sent, the request id (x-request-id, request-id or x-correlation-id).
  • Page sizes and record counts above a tool's maximum are rejected, not silently lowered, so "fewer rows than rowsPerPage means the last page" stays true. Pages are passed through as given; the server never fetches more than one page per call.
  • MCP_ALLOW_INSECURE_DEV=1 lets HTTP start without a secret, on 127.0.0.1 only, and requires NODE_ENV=development. With any other NODE_ENV the server refuses to start.
  • Tool output is MarketSharp data that other people may have typed (lead forms, notes, names). Every successful result is escaped and wrapped in <untrusted-content nonce="…"> markers behind a notice telling the model not to follow instructions inside it. MarketSharp's own error text is wrapped the same way.

See .env.example. The image's health check probes /health only when MCP_TRANSPORT=http.

Limits and unknowns

  • MarketSharp doesn't publish rate limits. The server retries 429 with Retry-After or exponential backoff (3 tries). A 503 is retried only for GET requests. Searches and filtered lists (which use POST) return it instead.
  • The /token 200 response shape isn't documented. The server accepts access_token or token, top level or inside response, or a bare JWT body (plain or JSON-quoted).
  • HTTP request bodies are capped at 256 KiB (262,144 bytes). Larger bodies, declared or chunked, get a 413.
  • Responses are capped at 200,000 characters; narrow with filters or paging. An oversized list keeps whole records and its paging fields (also when the page sits under response or data), and a note says how many records were left out. On the paged lists the note names the exact pageNumber and rowsPerPage (page and pageSize for employees) that read on from the first record left out; other tools can't page, so it says to narrow with filters. A list whose first record alone is over the cap is cut as text.
  • The QuickFind searches always send numberOfRecords (default 25): it is a non-nullable int32 in the spec, and what MarketSharp does with 0 is undocumented.
  • Not covered: calendar, texting, email, PaySimple, QuickBooks, CompanyCam, automation rules, analytics, estimates (v1 only), and all admin/config writes.

Security notes

  • companyId and employeeId are identifiers, not secrets. The companies tools return them by design.
  • MCP_ALLOWED_HOSTS is opt-in defence in depth behind S2S, not an auth control. It matches the Host header's hostname and ignores the port.
  • The S2S signature covers only the timestamp, the same as the gateway's verifier. Recipient binding comes from the per-vendor subkey.
  • MCP_ALLOW_INSECURE_DEV must never be set in a deployment.
  • A request has at most 4 MarketSharp calls in flight, each counted from the start of the fetch until its response body is fully read. A large JSON-RPC batch queues instead of fanning out. A retry's wait doesn't hold a slot.

Development

bash
npm ci --ignore-scriptsnpm run typecheck        # tsc --noEmitnpm run lint             # eslint + destructive-tool warning lintnpm run lint:destructive # destructive-tool warning lint onlynpm run buildnpm test                 # vitest, no networknpm run smoke            # spawns dist/index.js over stdio, no network

evals/ holds the mcp-assert suite that CI runs against the built server.

Each release publishes ghcr.io/wyre-ai/marketsharp-mcp, and its release notes are on the GitHub Release for that version.

License

Apache-2.0

来源:README.md,提交 ce304c1

工具

0
SourceWeft 尚未在沙箱中启动过该软件包,因此其工具未知。

版本历史

1
  1. v1.0.0最新Nov 11, 2026

评分

已满足适用检查项的 40%

该评分衡量此收录条目的完整程度,依据注册中心条目、端点与公开来源计算得出。它不是对服务器本身的评价,也不表示服务器安全或当前可用:可连通性是带日期的检查结果,评分也不包含安装量或用户评价。

  • 近 30 天内可连通25 分

    请保持端点能够响应 MCP 握手;SourceWeft 每 30 天探测一次。

  • 已声明认证方式10 分

    请在注册中心条目中声明凭据请求头,或保持端点能够响应探测,以便判定其认证方式。

  • 已列出工具15 分

    请让服务器在无凭据时响应 tools/list,或发布可在沙箱中无凭据启动的软件包。

  • 描述必需15 分
  • 图标10 分
  • 文档15 分
  • 许可证10 分

    请在仓库或注册中心条目中声明许可证。