Contribution Exchange
Contribution Exchange MCP: domain discovery, policies, preflight, proposals, and signals.
Should I use this
Quality & Safety
Based on automated analysis of tool definitions and protocol compliance.
Context Cost
This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.
Install
One-Click Install
Add this to your `claude_desktop_config.json` file:
{
"mcpServers": {
"contribution-exchange": {
"url": "https://signalaf.com/api/exchange/mcp"
}
}
}Remote endpoints
https://signalaf.com/api/exchange/mcpstreamable-httpWhat it can do
Tool inventory
Tools (6)
🟢exchange_discover_domain(domain)
Determine whether a domain publishes a Contribution Exchange profile. Returns the canonical Exchange manifest, policy URLs, signal URLs, and whether the domain is self-hosted or delegated to a Steward. Read-only — does not propose, commit, or authorize anything. Enforces HTTPS, redirect limits, timeouts, and SSRF protections (blocks loopback, link-local, private-network, and metadata-service targets).
Input Schema
{
"type": "object",
"properties": {
"domain": {
"type": "string",
"minLength": 3,
"maxLength": 253,
"description": "Domain name or HTTPS URL to check (e.g. 'signalaf.com' or 'https://signalaf.com'). Normalized to hostname."
}
},
"required": [
"domain"
],
"additionalProperties": false
}🟢exchange_get_policy(domain)
Fetch the canonical Contribution Exchange policy for a domain or its delegated Steward. Returns authority ceilings, consideration limits, human-review requirements, and supported behavior. Read-only — does not mutate state or perform preflight evaluation. Distinguishes a missing policy from an unavailable service.
Input Schema
{
"type": "object",
"properties": {
"domain": {
"type": "string",
"minLength": 3,
"maxLength": 253,
"description": "Domain name to fetch policy for."
}
},
"required": [
"domain"
],
"additionalProperties": false
}🟢exchange_preflight(domain, category, consideration, required_authorization, confidence)
Evaluate a proposed contribution against the same policy logic used by the real proposal flow. Returns whether the proposal is likely to be auto-engaged, accepted for review, escalated to a human, or rejected as invalid. READ-ONLY: performs no proposal insertion, notification, event creation, or state transition. The result is advisory and time-bound — a favorable preflight does NOT guarantee engagement, Commitment, authorization, payment, or execution. Uses the same evaluateProposal function as the canonical proposal route.
Input Schema
{
"type": "object",
"properties": {
"domain": {
"type": "string",
"minLength": 3,
"maxLength": 253,
"description": "Target domain for the proposed contribution."
},
"category": {
"type": "string",
"description": "Contribution category (e.g. 'technical', 'accessibility', 'documentation', 'research')."
},
"consideration": {
"type": "array",
"description": "Requested consideration (cash, royalty, reciprocal_access, attribution, referral, other). Advertised consideration is NOT binding until accepted through Commitment.",
"items": {
"type": "object"
}
},
"required_authorization": {
"type": "object",
"description": "Authority requested (inspect_public, sandbox_test, repository_write, private_data, credential_access, production_modify, deploy, penetration_testing).",
"properties": {
"inspect_public": {
"type": "boolean"
},
"sandbox_test": {
"type": "boolean"
},
"repository_read": {
"type": "boolean"
},
"repository_write": {
"type": "boolean"
},
"private_data": {
"type": "boolean"
},
"credential_access": {
"type": "boolean"
},
"production_modify": {
"type": "boolean"
},
"deploy": {
"type": "boolean"
},
"penetration_testing": {
"type": "boolean"
},
"other": {
"type": "array",
"items": {
"type": "string"
}
}
}
},
"confidence": {
"type": "object",
"description": "Confidence in the observation (score 0-1 and basis).",
"properties": {
"score": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"basis": {
"type": "string"
}
}
}
},
"required": [
"domain",
"category"
],
"additionalProperties": false
}🟢exchange_list_signals(domain, type, status, label, verification_mode, ...)
List domain-published Exchange Signals (problems, requests, challenges, bounties, verification tasks, discoveries, experiments). Read-only. Returns canonical URLs, signal revision, revision hash, and status. Signal status is DISTINCT from exchange status — a signal does not create a Commitment or authorize execution. Supports the same filters and pagination as the HTTP API.
Input Schema
{
"type": "object",
"properties": {
"domain": {
"type": "string",
"description": "Filter by publisher domain."
},
"type": {
"type": "string",
"enum": [
"problem",
"request",
"challenge",
"bounty",
"verification",
"discovery",
"experiment"
],
"description": "Filter by signal type."
},
"status": {
"type": "string",
"enum": [
"published",
"paused",
"closed",
"expired",
"withdrawn"
],
"description": "Filter by signal status."
},
"label": {
"type": "string",
"description": "Filter by label."
},
"verification_mode": {
"type": "string",
"enum": [
"deterministic",
"hybrid",
"manual"
],
"description": "Filter by verification mode."
},
"consideration_mode": {
"type": "string",
"enum": [
"fixed",
"maximum",
"negotiable"
],
"description": "Filter by consideration mode."
},
"accepting_attempts": {
"type": "boolean",
"description": "Only return signals currently accepting attempts."
},
"published_after": {
"type": "string",
"description": "ISO 8601 timestamp — only signals published after this."
},
"expires_before": {
"type": "string",
"description": "ISO 8601 timestamp — only signals expiring before this."
},
"cursor": {
"type": "string",
"description": "Pagination cursor from a previous response."
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 100,
"default": 50,
"description": "Maximum signals to return (1-100, default 50)."
}
},
"additionalProperties": false
}🟢exchange_get_signal(signal_id)
Get full detail for a single Exchange Signal by ID. Read-only. Returns the complete signal including constraints, participation rules, verification configuration, consideration declaration, and follow-on behavior. A signal does NOT create a Commitment, authorize execution, or guarantee payment.
Input Schema
{
"type": "object",
"properties": {
"signal_id": {
"type": "string",
"minLength": 1,
"maxLength": 200,
"description": "Signal ID."
}
},
"required": [
"signal_id"
],
"additionalProperties": false
}🟢exchange_get_attempt(signal_id, attempt_id)
Get detail for a signal attempt. Read-only. Enforces attempt visibility — actors may only read their own private attempts. Returns attempt status and verification result if available. Attempt status is NOT an exchange state. Verification is Steward-controlled and cannot be self-asserted.
Input Schema
{
"type": "object",
"properties": {
"signal_id": {
"type": "string",
"minLength": 1,
"maxLength": 200,
"description": "Signal ID."
},
"attempt_id": {
"type": "string",
"minLength": 1,
"maxLength": 200,
"description": "Attempt ID."
}
},
"required": [
"signal_id",
"attempt_id"
],
"additionalProperties": false
}Community
Evidence