MCP server for the Philoscopia framework: explore 80 axes of philosophical positions, compare figures, and build your own philosophical profile in a local, private workspace.
Philoscopia demonstrates solid tool design with consistent naming (verb_noun pattern), comprehensive descriptions (100-300 chars typical), and well-structured schemas using Zod. All 20 tools have descriptions and input schemas. However, output schemas are not formally documented in the code, responses are rendered as text via asText() helper without explicit schema declarations. Parameter descriptions are present but sometimes lack constraint details (e.g., no min/max for search limit). Error handling is basic (asError wrapper) without recovery guidance. The server excels at domain-specific clarity (e.g., 'record_position' with explicit status/confidence enums) but lacks production-grade error messaging and output schema documentation.
Add an entry to one of the user's collections (beliefs, affinities, inquiries, practices, concepts, quotes, readings). Each collection has its own schema; entries are immutable once written (retire + new for revision).
One axis (~600 tokens): poles with descriptions and anchor figures, stakes, named median, related axes, plus `arguments` — the canonical reasons (SUPPORTS) and objections (OBJECTS) per pole as {ref, kind, on, claim}; fetch one via get_entity(arg:…) before challenging or grounding a position. Its sub-problem map is separate: problemCount > 0 means get_axis_problems has material.
The axis's map of live sub-problems (~1-2k tokens; SURFACED and LATENT seeds for deepening). Only when the conversation explores the axis in depth — never just to situate it.
Any entity by prefixed ref: ph:epictetus, mv:stoicism, chr:… (character), c:… (concept), te:… (thought experiment), w:… (work), ax:… (axis), problem:… (one axis sub-problem, with its home axis), arg:… (a corpus argument: its claim, step-by-step development, source, and — for an objection — the resolution options), theme:… (a discovery theme: the axes that treat a general-public notion, e.g. theme:happiness → SOVEREIGN_GOOD, DESIRE, …). A figure arrives as a DIGEST (~1k tokens): identity, structuring theses, and every position WITHOUT its justification — get_position supplies the justifications you actually discuss. full:true (the RICH view, ~2-5k tokens: summary, voice, the justified MAJOR/structuring positions — minor positions stay compact lines, get_position widens one) only for a whole-figure portrait, or when you do not know the figure at all.
Output schemas not formally documented. Tools return text via asText() helper without declaring expected response structure. LLMs cannot plan downstream calls or extract structured data reliably.
Error handling lacks recovery guidance. asError() returns bare error messages without actionable next steps (e.g., 'Unknown axis, try search() or list_axes()').
Parameter constraints incomplete. search() limit parameter lacks min/max bounds; add_entry() 'entry' parameter is generic object without schema validation hints.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 60 | 2026-07-28+ | v2 |
What grounds what on one axis: the canonical arguments that support each pole, and the figures whose positions on the axis are foundational (cited as justification by others). Socratic material for deepening.
One figure's position on ONE axis (axisId) or several at once (axisIds), each with its sourced justification (~300 tokens per axis). The default read whenever the question concerns a figure on an axis; batch one figure's axes in a single call.
The user's current profile: all recorded positions (with history), entries (beliefs, affinities, inquiries, practices, concepts, quotes, readings), and metadata (created, updated, next). Errors if the workspace is not initialized.
List all profile syntheses (dated prose portraits crossing positions, entries, and who the user is). Each is an immutable generation; returns metadata (date, title) for each.
The positions in tension on one axis: pairs of poles whose canonical arguments object to each other, or figures whose positions on the axis are opposed. Socratic material for deepening.
The complete usage guide: what this server offers, the typical session flow (explore, elicit, record with provenance, journal, summarize) and the rules of care. Call it when unsure how to proceed.
Create the user's local my-philosophy/ workspace folder and initialize the manifest (locale, user block: expertise, goals, motivations). Call once per user, after getting acquainted in conversation.
The axis map (id, question, poles), grouped by relation. Default = the CORE axes only (the framework's backbone, ~2 dozen nodal questions) with a note counting the rest; pass relation (TRUTH, SELF, OTHERS or WORLD) for that quarter's FULL list, or all:true for the whole map. To locate one specific axis, search is cheaper.
Log a session narrative (what was explored, what was clarified, what remains open). Linked from the records; ask what to pick up next time and pass it as next — orient serves it back at the next opening.
The opening overview, made to be RESTATED to the user in a few simple sentences (never dumped): what the framework offers, who the user is (expertise, goals, motivations), their carnet's state, the thread left open last time (next), suggested threads to pick up, and the session menu. Call it at the FIRST interaction of every conversation, or whenever the user seems lost.
Compute a readable summary of the user's profile (positions, entries, metadata). Pass writeSummaryMd: true to write it to the workspace as a dated markdown file; returns the summary text either way.
Record or update a position on one axis: status (EXPLORING or POSITIONED), value (scalar or weights), confidence, salience, rationale, reasons (endorsed arguments), and provenance (which modality elicited it). Returns the consolidated record with history.
Retire an entry (mark it ABANDONED, archive it). A substantive revision is a new entry; the trajectory is part of the profile.
Naive but effective substring search across the whole corpus (axes, figures, concepts, thought experiments, arguments, themes, problems). Returns up to 20 results: ref, name, and a hint (question, definition, summary, or axes for themes).
Update the user block (expertise, goals, motivations). Pass null to delete a field; omitted fields are left untouched. Returns the merged user block.
Write a new profile synthesis (a dated prose portrait crossing positions, entries, and who the user is, to say what no single record says alone). Each generation is immutable; draft WITH the user and let them amend before writing.
Destructive operations (retire_entry, init_workspace) lack confirmation or dry-run support. No guard against accidental data loss.
Workspace tools (record_position, add_entry, etc.) do not document permission requirements or audit trail expectations. No scope declarations.