{
  "name": "CommsHarbor",
  "description": "Try a temporary workspace to organise contacts and drafts. Link an account when you are ready; sending requires an enabled organisation.",
  "url": "https://commsharbor.com",
  "provider": {
    "organization": "CommsHarbor",
    "url": "https://commsharbor.com",
    "email": "contato@commsharbor.com"
  },
  "documentationUrl": "https://commsharbor.com/llms.txt",
  "protocol": "mcp",
  "protocolUrl": "https://modelcontextprotocol.io",
  "interfaces": [
    {
      "transport": "streamable-http",
      "url": "https://commsharbor.com/mcp"
    }
  ],
  "capabilities": {
    "streaming": true,
    "pushNotifications": false,
    "authentication": "none"
  },
  "defaultInputModes": [
    "application/json"
  ],
  "defaultOutputModes": [
    "application/json",
    "text/markdown"
  ],
  "skills": [
    {
      "id": "commsharbor_health",
      "name": "commsharbor_health",
      "description": "Read deployment health and build. Smoke tests wait for their own commit to appear here instead of racing edge propagation.",
      "endpoint": "GET /api/health"
    },
    {
      "id": "commsharbor_logout",
      "name": "commsharbor_logout",
      "description": "Revoke the current session. Bootstrap/CSRF must belong to this browser and session. Other product sessions remain active.",
      "endpoint": "POST /api/auth/logout"
    },
    {
      "id": "commsharbor_me",
      "name": "commsharbor_me",
      "description": "Read the current account profile and platform role. `user.id` is the shared-account ID. Organizations are not listed here: they live in the shared account, which does not list them inside products yet — open a workspace by its ID with `GET /api/organizations/{organization_id}`.",
      "endpoint": "GET /api/me"
    },
    {
      "id": "commsharbor_context",
      "name": "commsharbor_context",
      "description": "Resolve the active organization identity. Read this before a write when you are not certain which tenant is active. Guessing is how data lands in the wrong organization. An organization API key answers `kind: api_key` with its scopes.",
      "endpoint": "GET /api/context"
    },
    {
      "id": "commsharbor_organization_get",
      "name": "commsharbor_organization_get",
      "description": "Open an organization by id: name, your role and the CommsHarbor plan. This is how a workspace is opened. Name and role come from the shared account (null with an organization API key, which carries neither); the plan is the organization's global entitlement in CommsHarbor.",
      "endpoint": "GET /api/organizations/:organization_id"
    },
    {
      "id": "commsharbor_audit",
      "name": "commsharbor_audit",
      "description": "List tenant audit events. Audit records are never rewritten and never carry recipient PII.",
      "endpoint": "GET /api/organizations/:organization_id/audit"
    },
    {
      "id": "commsharbor_platform_context",
      "name": "commsharbor_platform_context",
      "description": "Confirm the caller's platform role. Tenant ownership grants nothing here: platform access is a separate, explicit grant.",
      "endpoint": "GET /api/platform/context"
    },
    {
      "id": "commsharbor_domains",
      "name": "commsharbor_domains",
      "description": "List sending domains with their last observed state. `status` is what was last OBSERVED at SES and DNS. It does not become `active` because provisioning was requested.",
      "endpoint": "GET /api/organizations/:organization_id/domains"
    },
    {
      "id": "commsharbor_domain_create",
      "name": "commsharbor_domain_create",
      "description": "Register the organization's exact sending domain and queue SES provisioning. Asking twice does not provision twice. Publish the returned DKIM records, then call `verify` to have the state observed.",
      "endpoint": "POST /api/organizations/:organization_id/domains"
    },
    {
      "id": "commsharbor_domain_get",
      "name": "commsharbor_domain_get",
      "description": "Read one stored sending-domain resource. This returns what was stored at the last observation. To look again, call `verify`.",
      "endpoint": "GET /api/organizations/:organization_id/domains/:domain_id"
    },
    {
      "id": "commsharbor_domain_verify",
      "name": "commsharbor_domain_verify",
      "description": "Refresh domain readiness from real SES and DNS observations. This is the ONLY operation that can move a domain to `active`, and only because it actually looked.",
      "endpoint": "POST /api/organizations/:organization_id/domains/:domain_id/verify"
    },
    {
      "id": "commsharbor_domain_smoke",
      "name": "commsharbor_domain_smoke",
      "description": "Send one controlled smoke to the server-side recipient secret; never accepts a recipient argument. The request never accepts a recipient: the destination is a server-side secret. That is what keeps this from becoming a way to send mail to arbitrary addresses through someone else's verified domain.",
      "endpoint": "POST /api/organizations/:organization_id/domains/:domain_id/smoke"
    },
    {
      "id": "commsharbor_domain_deliveries",
      "name": "commsharbor_domain_deliveries",
      "description": "List a domain's deliveries without recipient addresses.",
      "endpoint": "GET /api/organizations/:organization_id/domains/:domain_id/deliveries"
    },
    {
      "id": "commsharbor_delivery_get",
      "name": "commsharbor_delivery_get",
      "description": "Read one delivery and its SES MessageId without recipient data. `ses_message_id` is what correlates this record with AWS when you need to chase a message there.",
      "endpoint": "GET /api/organizations/:organization_id/deliveries/:delivery_id"
    },
    {
      "id": "commsharbor_delivery_events",
      "name": "commsharbor_delivery_events",
      "description": "List normalized SES feedback events for one delivery. Open and Click are ADDITIVE: they are recorded alongside delivery state and never overwrite it.",
      "endpoint": "GET /api/organizations/:organization_id/deliveries/:delivery_id/events"
    },
    {
      "id": "commsharbor_crm_contacts_list",
      "name": "commsharbor_crm_contacts_list",
      "description": "Lists contacts in the tenant CRM — a person in the tenant CRM. Cursor-paginated: limit 1-100, opaque cursor from the previous page. Filters: q, company_id. Needs crm:read on the organization. Every item carries an absolute url. Being in the CRM is not permission to email: consent lives in the `marketing` sub-resource.",
      "endpoint": "GET /api/organizations/:organization_id/crm/contacts"
    },
    {
      "id": "commsharbor_crm_contacts_create",
      "name": "commsharbor_crm_contacts_create",
      "description": "Creates a contact in the tenant CRM. Required: email, first_name. Needs crm:write on the organization. Returns the created resource with its absolute url. Being in the CRM is not permission to email: consent lives in the `marketing` sub-resource.",
      "endpoint": "POST /api/organizations/:organization_id/crm/contacts"
    },
    {
      "id": "commsharbor_crm_contacts_get",
      "name": "commsharbor_crm_contacts_get",
      "description": "Reads one contact from the tenant CRM. Needs crm:read on the organization. A foreign or missing id answers 404. Being in the CRM is not permission to email: consent lives in the `marketing` sub-resource.",
      "endpoint": "GET /api/organizations/:organization_id/crm/contacts/:contact_id"
    },
    {
      "id": "commsharbor_crm_contacts_update",
      "name": "commsharbor_crm_contacts_update",
      "description": "Updates one contact in the tenant CRM; only the fields you send change. Needs crm:write on the organization. A foreign or missing id answers 404. Being in the CRM is not permission to email: consent lives in the `marketing` sub-resource.",
      "endpoint": "PATCH /api/organizations/:organization_id/crm/contacts/:contact_id"
    },
    {
      "id": "commsharbor_crm_contacts_delete",
      "name": "commsharbor_crm_contacts_delete",
      "description": "Deletes one contact from the tenant CRM. Needs crm:write on the organization. A foreign or missing id answers 404. Being in the CRM is not permission to email: consent lives in the `marketing` sub-resource.",
      "endpoint": "DELETE /api/organizations/:organization_id/crm/contacts/:contact_id"
    },
    {
      "id": "commsharbor_crm_companies_list",
      "name": "commsharbor_crm_companies_list",
      "description": "Lists companies in the tenant CRM — an organization in the tenant CRM — a customer of the customer. Cursor-paginated: limit 1-100, opaque cursor from the previous page. Filters: q. Needs crm:read on the organization. Every item carries an absolute url.",
      "endpoint": "GET /api/organizations/:organization_id/crm/companies"
    },
    {
      "id": "commsharbor_crm_companies_create",
      "name": "commsharbor_crm_companies_create",
      "description": "Creates a company in the tenant CRM. Required: name. Needs crm:write on the organization. Returns the created resource with its absolute url.",
      "endpoint": "POST /api/organizations/:organization_id/crm/companies"
    },
    {
      "id": "commsharbor_crm_companies_get",
      "name": "commsharbor_crm_companies_get",
      "description": "Reads one company from the tenant CRM. Needs crm:read on the organization. A foreign or missing id answers 404.",
      "endpoint": "GET /api/organizations/:organization_id/crm/companies/:company_id"
    },
    {
      "id": "commsharbor_crm_companies_update",
      "name": "commsharbor_crm_companies_update",
      "description": "Updates one company in the tenant CRM; only the fields you send change. Needs crm:write on the organization. A foreign or missing id answers 404.",
      "endpoint": "PATCH /api/organizations/:organization_id/crm/companies/:company_id"
    }
  ],
  "discovery": {
    "openapi": "https://commsharbor.com/openapi.json",
    "llms": "https://commsharbor.com/llms.txt",
    "okf": "https://commsharbor.com/okf/index.md",
    "numbers": "https://commsharbor.com/api/vitrine",
    "partnerships": "https://commsharbor.com/api/partners",
    "api_catalog": "https://commsharbor.com/.well-known/api-catalog",
    "x402": "https://commsharbor.com/.well-known/x402",
    "pricing": "https://commsharbor.com/pricing",
    "docs": "https://commsharbor.com/docs"
  },
  "updated": "2026-10-04"
}