MCP Server

hunchful

io.hunchful/hunchful
Productivity Auth required MCP 2025-11-25

What this MCP does

Maintains a consent-based, revisable model of a person's working preferences and supports collaboration matching and refinement.

add_hunch
Record a NEW hunch the person just confirmed in conversation — a custom axis with their answer, added directly to their model (visible, revisable, removable by them). OWNER-LEVEL trust required: OAuth as the owner, or the editToken. Only record what the person actually said — never invent or infer a hunch they didn't confirm. For situational axes name it 'When <situation>'. If they haven't answered yet, use suggest_question instead.
Open world
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['name', 'poleA', 'poleB', 'pole'], 'properties': {'by': {'type': 'string', 'description': 'Your name, e.g. "claude" — recorded in the revision history.'}, 'name': {'type': 'string', 'description': 'Short axis name, e.g. "When plans change suddenly".'}, 'pole': {'enum': ['A', 'B'], 'type': 'string', 'description': 'The pole the person SAID fits them.'}, 'poleA': {'type': 'string', 'description': 'Pole A label.'}, 'poleB': {'type': 'string', 'description': 'Pole B label.'}, 'modelId': {'type': 'string'}, 'editToken': {'type': 'string', 'description': "The model's edit key, if not connected via OAuth."}, 'confidence': {'type': 'number', 'maximum': 0.97, 'minimum': 0.05, 'description': '0.05–0.97; default 0.7 for a fresh self-stated answer.'}}, 'additionalProperties': False}
Output schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['ok', 'patternId', 'urls', 'note'], 'properties': {'ok': {'type': 'boolean'}, 'note': {'type': 'string'}, 'urls': {'type': 'object', 'required': ['publicPage', 'editHub', 'introductions'], 'properties': {'editHub': {'type': 'string'}, 'publicPage': {'type': 'string'}, 'introductions': {'type': 'string'}}, 'additionalProperties': False}, 'falsifier': {'type': 'string'}, 'patternId': {'type': 'string'}, 'statement': {'type': 'string'}}, 'additionalProperties': False}
apply_refinement
Apply a refinement directly as one logged revision (append evidence pointers, nudge confidence). Authorized by OAuth (own model) or an editToken. Prefer propose_refinement unless the owner asked for direct writes.
Open world
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['items'], 'properties': {'items': {'type': 'array', 'items': {'type': 'object', 'required': ['patternId', 'direction'], 'properties': {'source': {'type': 'string', 'description': 'Provenance pointer only, e.g. "agent:chatgpt". No free text, no names.'}, 'direction': {'enum': ['strengthens', 'weakens'], 'type': 'string', 'description': 'Does the evidence strengthen or weaken this hunch?'}, 'patternId': {'type': 'string', 'description': "One of the model's refinable axis ids (see read_model → refinablePatternIds)."}, 'observedAt': {'type': 'string', 'description': 'ISO date the evidence was observed (defaults to now).'}}, 'additionalProperties': False}, 'maxItems': 50, 'minItems': 1}, 'modelId': {'type': 'string'}, 'editToken': {'type': 'string', 'description': "The model's edit key, if not connected via OAuth."}}, 'additionalProperties': False}
Output schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['ok', 'applied', 'updatedAt', 'urls', 'note'], 'properties': {'ok': {'type': 'boolean'}, 'note': {'type': 'string'}, 'urls': {'type': 'object', 'required': ['publicPage', 'editHub', 'introductions'], 'properties': {'editHub': {'type': 'string'}, 'publicPage': {'type': 'string'}, 'introductions': {'type': 'string'}}, 'additionalProperties': False}, 'applied': {'type': 'array', 'items': {'type': 'object', 'required': ['patternId', 'direction', 'confidence'], 'properties': {'direction': {'type': 'string'}, 'patternId': {'type': 'string'}, 'confidence': {'type': 'number'}}, 'additionalProperties': False}}, 'updatedAt': {'type': 'string'}}, 'additionalProperties': False}
find_complementary_thinkers
Which famous thinkers would COMPLETE this person — opposite poles on the axes where opposites unstick each other (not similarity). Open read; great for curiosity and for explaining what a complementary collaborator looks like. Share the pages as links.
Read only Open world Idempotent
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {'modelId': {'type': 'string', 'description': "Model id. Omit when connected via OAuth to use the person's own model."}}, 'additionalProperties': False}
Output schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['modelId', 'note', 'complements', 'humanVersion'], 'properties': {'note': {'type': 'string'}, 'modelId': {'type': 'string'}, 'complements': {'type': 'array', 'items': {'type': 'object', 'required': ['name', 'tag', 'blurb', 'complementaryAxes', 'url'], 'properties': {'tag': {'type': 'string'}, 'url': {'type': 'string'}, 'name': {'type': 'string'}, 'blurb': {'type': 'string'}, 'complementaryAxes': {'type': 'array', 'items': {'type': 'object', 'required': ['axis', 'why'], 'properties': {'why': {'type': 'string'}, 'axis': {'type': 'string'}}, 'additionalProperties': False}}}, 'additionalProperties': False}}, 'humanVersion': {'type': 'string'}}, 'additionalProperties': False}
find_matches
Look for complementary PEOPLE for the connected person (rule: agents propose, humans accept — this creates pending proposals the human decides on in their Hunchful hub; identities are never revealed here). Requires OAuth as the owner or the model's editToken, and the person must have joined introductions on their matches page.
Open world
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {'modelId': {'type': 'string'}, 'direction': {'enum': ['seek', 'offer'], 'type': 'string', 'description': 'seek = they want a fresh angle; offer = they can offer one. Default seek.'}, 'editToken': {'type': 'string', 'description': "The model's edit key, if not connected via OAuth."}}, 'additionalProperties': False}
Output schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['proposals', 'matchesUrl', 'note'], 'properties': {'note': {'type': 'string'}, 'proposals': {'type': 'array', 'items': {'type': 'object', 'required': ['proposalId', 'rationale', 'otherIntent', 'mySideAccepted', 'otherSideAccepted', 'status'], 'properties': {'status': {'type': 'string'}, 'rationale': {'type': 'object', 'properties': {}, 'additionalProperties': True}, 'proposalId': {'type': 'string'}, 'otherIntent': {'type': 'string'}, 'mySideAccepted': {'type': 'boolean'}, 'otherSideAccepted': {'type': 'boolean'}}, 'additionalProperties': False}}, 'matchesUrl': {'type': 'string'}}, 'additionalProperties': False}
propose_refinement
Propose a refinement (provenance pointers only). It lands in the owner's confirm queue — nothing changes until they accept. Authorized by OAuth (own model) or a contributionToken.
Open world
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['items'], 'properties': {'items': {'type': 'array', 'items': {'type': 'object', 'required': ['patternId', 'direction'], 'properties': {'source': {'type': 'string', 'description': 'Provenance pointer only, e.g. "agent:chatgpt". No free text, no names.'}, 'direction': {'enum': ['strengthens', 'weakens'], 'type': 'string', 'description': 'Does the evidence strengthen or weaken this hunch?'}, 'patternId': {'type': 'string', 'description': "One of the model's refinable axis ids (see read_model → refinablePatternIds)."}, 'observedAt': {'type': 'string', 'description': 'ISO date the evidence was observed (defaults to now).'}}, 'additionalProperties': False}, 'maxItems': 50, 'minItems': 1}, 'modelId': {'type': 'string'}, 'contributionToken': {'type': 'string', 'description': 'Scoped propose-only key, if not connected via OAuth.'}}, 'additionalProperties': False}
Output schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['status', 'proposalIds', 'reviewUrl', 'note'], 'properties': {'note': {'type': 'string'}, 'status': {'type': 'string'}, 'reviewUrl': {'type': 'string'}, 'proposalIds': {'type': 'array', 'items': {'type': 'string'}}}, 'additionalProperties': False}
read_model
Read a Hunchful collaboration model: its hunches (axis, pole, confidence), the axis ids you can refine, and how you're connected. Start here. With OAuth, omit modelId to read the connected person's own model.
Read only Open world Idempotent
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {'modelId': {'type': 'string', 'description': "Model id. Omit when connected via OAuth to use the person's own model."}}, 'additionalProperties': False}
Output schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['modelId', 'connectedAs', 'libraryVersion', 'hunches', 'refinablePatternIds', 'openHunches', 'guidance', 'constraints', 'canApplyDirectly', 'urls', 'render'], 'properties': {'urls': {'type': 'object', 'required': ['publicPage', 'editHub', 'introductions'], 'properties': {'editHub': {'type': 'string'}, 'publicPage': {'type': 'string'}, 'introductions': {'type': 'string'}}, 'additionalProperties': False}, 'render': {'type': 'string'}, 'hunches': {'type': 'array', 'items': {'type': 'object', 'required': ['patternId', 'pole', 'statement', 'confidence', 'uncertainty', 'falsifier', 'axis'], 'properties': {'axis': {'type': 'object', 'required': ['name', 'poleA', 'poleB'], 'properties': {'name': {'type': 'string'}, 'poleA': {'type': 'string'}, 'poleB': {'type': 'string'}}, 'additionalProperties': False}, 'pole': {'enum': ['A', 'B'], 'type': 'string'}, 'falsifier': {'type': 'string'}, 'patternId': {'type': 'string'}, 'statement': {'type': 'string'}, 'confidence': {'type': 'number'}, 'appliesWhen': {'type': 'string'}, 'situational': {'type': 'boolean'}, 'uncertainty': {'type': 'string'}}, 'additionalProperties': False}}, 'modelId': {'type': 'string'}, 'guidance': {'type': 'string'}, 'connectedAs': {'type': 'string'}, 'constraints': {'type': 'string'}, 'openHunches': {'type': 'object', 'required': ['patternIds', 'howto'], 'properties': {'howto': {'type': 'string'}, 'patternIds': {'type': 'array', 'items': {'type': 'string'}}}, 'additionalProperties': False}, 'howToConnect': {'type': 'string'}, 'libraryVersion': {'type': 'string'}, 'canApplyDirectly': {'type': 'boolean'}, 'refinablePatternIds': {'type': 'array', 'items': {'type': 'string'}}}, 'additionalProperties': False}
suggest_question
Suggest a NEW question/axis for the person — a dimension their model doesn't capture (situational axes welcome: name it 'When <situation>'). It lands in their Hunchful inbox and, by default, emails them; nothing is added until they answer. Authorized by OAuth (own model) or a contributionToken. Use sparingly — about once a week at most.
Open world
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['name', 'poleA', 'poleB', 'question'], 'properties': {'by': {'type': 'string', 'description': 'Your name, e.g. "claude".'}, 'why': {'type': 'string', 'description': "Why you're asking — what you observed (no quotes, no names)."}, 'name': {'type': 'string', 'description': 'Short axis name, e.g. "When plans change suddenly".'}, 'poleA': {'type': 'string', 'description': 'Pole A label — one way of working.'}, 'poleB': {'type': 'string', 'description': 'Pole B label — the other way.'}, 'modelId': {'type': 'string'}, 'question': {'type': 'string', 'description': 'The question, addressed to the person.'}, 'contributionToken': {'type': 'string', 'description': 'Scoped propose-only key, if not connected via OAuth.'}}, 'additionalProperties': False}
Output schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['status', 'proposalId', 'notified', 'inboxUrl', 'note'], 'properties': {'note': {'type': 'string'}, 'status': {'type': 'string'}, 'inboxUrl': {'type': 'string'}, 'notified': {'type': 'boolean'}, 'proposalId': {'type': 'string'}}, 'additionalProperties': False}
Added
apply_refinement
Sept. 17, 2026, 12:53 p.m.
Added
find_matches
Sept. 17, 2026, 12:53 p.m.
Added
find_complementary_thinkers
Sept. 17, 2026, 12:53 p.m.
Added
add_hunch
Sept. 17, 2026, 12:53 p.m.
Added
suggest_question
Sept. 17, 2026, 12:53 p.m.
Added
propose_refinement
Sept. 17, 2026, 12:53 p.m.
Added
read_model
Sept. 17, 2026, 12:53 p.m.