Skip to main content
Glama

Kaneme — Your writing identity, measured and portable

Trial measurement, no account

measure_authorship

Measures whether a text is by the SAME HAND as three reference texts pasted in the call. No account, no credits, nothing stored. Exactly 3 references of 100+ words each, in DIFFERENT registers, and a text of 50+ words (150 to leave low confidence). Returns a calibrated PROBABILITY, its label and four stylometric dimensions (not a breakdown of the probability). probability: null with unavailable is a measured abstention; only embedding_layer is an outage on our side. Not verify_authorship, which uses the account’s saved voice. For that, a Kaneme account at https://kaneme.com and the authenticated MCP connection.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
textYesText to attribute (50+ words), not taken from the references (self_overlap).
samplesYesExactly 3 texts by the person, 100+ words each, different registers.
questionNohuman = this person vs an AI (default) · author = this person vs another human.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed4 schema fields changed
    • changedInput schema / properties / question / description
      Previous value: -"human = cette personne contre une IA (défaut) ; author = cette personne contre un autre humain."New value: +"human = this person vs an AI (default) · author = this person vs another human."
    • changedInput schema / properties / samples / description
      Previous value: -"Exactement 3 textes de la personne, 100 mots minimum chacun, dans des registres différents."New value: +"Exactly 3 texts by the person, 100+ words each, different registers."
    • changedInput schema / properties / text / description
      Previous value: -"Le texte à attribuer (50 mots minimum). Ne le prends PAS dans les références : la mesure s’abstiendrait (self_overlap)."New value: +"Text to attribute (50+ words), not taken from the references (self_overlap)."
    • changedOutput schema / (root)
      Previous value: -{
      -  "additionalProperties": {},
      -  "properties": {
      -    "confidence": {
      -      "enum": [
      -        "none",
      -        "low",
      -        "medium",
      -        "high"
      -      ],
      -      "type": "string"
      -    },
      -    "dimensions": {
      -      "description": "Sur quoi le texte s’écarte des références : rythme, lexique, structure, signature. Ce n’est PAS la décomposition de `probability` — ces quatre-là lisent la couche stylométrique, qui pèse 20 % du score fusionné. Servies même en abstention : ce sont des faits mesurés, pas un verdict.",
      -      "items": {
      -        "additionalProperties": {},
      -        "properties": {
      -          "detail": {
      -            "type": "string"
      -          },
      -          "id": {
      -            "enum": [
      -              "rythme",
      -              "lexique",
      -              "structure",
      -              "signature"
      -            ],
      -            "type": "string"
      -          },
      -          "label": {
      -            "type": "string"
      -          },
      -          "measured": {
      -            "type": "boolean"
      -          },
      -          "passages": {
      -            "items": {
      -              "additionalProperties": false,
      -              "properties": {
      -                "basis": {
      -                  "enum": [
      -                    "reference",
      -                    "preference",
      -                    "observation"
      -                  ],
      -                  "type": "string"
      -                },
      -                "end": {
      -                  "type": "number"
      -                },
      -                "observation": {
      -                  "type": "string"
      -                },
      -                "quote": {
      -                  "type": "string"
      -                },
      -                "start": {
      -                  "type": "number"
      -                }
      -              },
      -              "required": [
      -                "start",
      -                "end",
      -                "quote",
      -                "observation",
      -                "basis"
      -              ],
      -              "type": "object"
      -            },
      -            "type": "array"
      -          },
      -          "score": {
      -            "anyOf": [
      -              {
      -                "type": "number"
      -              },
      -              {
      -                "type": "null"
      -              }
      -            ]
      -          }
      -        },
      -        "required": [
      -          "id",
      -          "label",
      -          "measured",
      -          "score",
      -          "detail"
      -        ],
      -        "type": "object"
      -      },
      -      "type": "array"
      -    },
      -    "dimensionsVersion": {
      -      "type": "string"
      -    },
      -    "explanation": {
      -      "additionalProperties": {},
      -      "properties": {
      -        "caveat": {
      -          "type": "string"
      -        },
      -        "factors": {
      -          "items": {
      -            "additionalProperties": {},
      -            "properties": {
      -              "detail": {
      -                "type": "string"
      -              },
      -              "gap": {
      -                "anyOf": [
      -                  {
      -                    "maximum": 1,
      -                    "minimum": 0,
      -                    "type": "number"
      -                  },
      -                  {
      -                    "type": "null"
      -                  }
      -                ]
      -              },
      -              "id": {
      -                "enum": [
      -                  "cadence",
      -                  "registre",
      -                  "structure",
      -                  "lexique"
      -                ],
      -                "type": "string"
      -              },
      -              "label": {
      -                "type": "string"
      -              },
      -              "status": {
      -                "enum": [
      -                  "aligned",
      -                  "mixed",
      -                  "different",
      -                  "unmeasured"
      -                ],
      -                "type": "string"
      -              }
      -            },
      -            "required": [
      -              "id",
      -              "label",
      -              "status",
      -              "gap",
      -              "detail"
      -            ],
      -            "type": "object"
      -          },
      -          "type": "array"
      -        },
      -        "summary": {
      -          "type": "string"
      -        },
      -        "version": {
      -          "type": "string"
      -        }
      -      },
      -      "required": [
      -        "version",
      -        "summary",
      -        "caveat",
      -        "factors"
      -      ],
      -      "type": "object"
      -    },
      -    "label": {
      -      "description": "Attribution en clair, dérivée de `probability`. Absent quand `unavailable` est présent.",
      -      "type": "string"
      -    },
      -    "language": {
      -      "type": "string"
      -    },
      -    "measurement": {
      -      "additionalProperties": false,
      -      "properties": {
      -        "axis": {
      -          "enum": [
      -            "q1",
      -            "q2"
      -          ],
      -          "type": "string"
      -        },
      -        "calibrationLanguage": {
      -          "enum": [
      -            "fr",
      -            "en"
      -          ],
      -          "type": "string"
      -        },
      -        "calibrationSource": {
      -          "type": "string"
      -        },
      -        "calibrationVersion": {
      -          "type": "string"
      -        },
      -        "candidateLanguage": {
      -          "type": "string"
      -        },
      -        "contrast": {
      -          "type": "string"
      -        },
      -        "display": {
      -          "anyOf": [
      -            {
      -              "type": "string"
      -            },
      -            {
      -              "type": "null"
      -            }
      -          ]
      -        },
      -        "limitation": {
      -          "type": "string"
      -        },
      -        "model": {
      -          "type": "string"
      -        },
      -        "scoreVersion": {
      -          "type": "string"
      -        },
      -        "version": {
      -          "const": "kaneme.measurement.v1",
      -          "type": "string"
      -        }
      -      },
      -      "required": [
      -        "version",
      -        "axis",
      -        "contrast",
      -        "display",
      -        "calibrationLanguage",
      -        "candidateLanguage",
      -        "model",
      -        "scoreVersion",
      -        "calibrationVersion",
      -        "calibrationSource",
      -        "limitation"
      -      ],
      -      "type": "object"
      -    },
      -    "passages": {
      -      "description": "Présent uniquement avec `unavailable: \"mixed_language\"` : les phrases écrites dans l’autre langue, avec leurs positions (`start`, `end`) dans le texte jugé. Les corriger ou les retirer, puis relancer.",
      -      "items": {
      -        "additionalProperties": {},
      -        "properties": {
      -          "end": {
      -            "maximum": 9007199254740991,
      -            "minimum": 0,
      -            "type": "integer"
      -          },
      -          "language": {
      -            "enum": [
      -              "fr",
      -              "en"
      -            ],
      -            "type": "string"
      -          },
      -          "start": {
      -            "maximum": 9007199254740991,
      -            "minimum": 0,
      -            "type": "integer"
      -          },
      -          "text": {
      -            "type": "string"
      -          }
      -        },
      -        "required": [
      -          "text",
      -          "start",
      -          "end",
      -          "language"
      -        ],
      -        "type": "object"
      -      },
      -      "type": "array"
      -    },
      -    "probability": {
      -      "anyOf": [
      -        {
      -          "maximum": 1,
      -          "minimum": 0,
      -          "type": "number"
      -        },
      -        {
      -          "type": "null"
      -        }
      -      ]
      -    },
      -    "question": {
      -      "enum": [
      -        "author",
      -        "human"
      -      ],
      -      "type": "string"
      -    },
      -    "referenceLimited": {
      -      "type": "boolean"
      -    },
      -    "unavailable": {
      -      "description": "self_overlap — Le texte à juger est déjà, pour l’essentiel, dans la référence qui le juge : la mesure porterait sur elle-même. Juge un texte que la référence ne contient pas — ou retire-le du corpus de cette voix. · unsupported_language — Le texte ne se lit ni en français ni en anglais, même en départageant ces deux seules langues : le verdict n’est calibré que sur elles, chacune avec son propre moteur. Lis le champ `language` de la réponse avant d’appeler : hors du français et de l’anglais, ne demande pas de verdict. · voice_language_mismatch — Le texte et la voix de référence ne sont pas écrits dans la même langue : chaque moteur ne compare un texte qu’à une voix de sa langue. Juge ce texte avec une voix écrite dans sa langue — crée-la si elle n’existe pas. Ne le traduis pas pour contourner ce refus. · mixed_language — Le texte est dans la langue de la voix, mais au moins une phrase entière est dans l’autre langue servie : la mesure mêlerait deux moteurs. Corrige ou retire les passages renvoyés dans `passages` (positions dans le texte), puis relance. Les mots isolés — anglicismes, marques — et les citations entre guillemets ne déclenchent pas ce refus. · embedding_layer — La couche de mesure profonde n’a pas répondu ; sans elle, aucune probabilité n’est calibrée. Réessaie dans un instant si la couche de mesure redevient disponible. · out_of_distribution — Le panel de contraste ne couvre pas le registre de cette voix : la marge existerait, elle ne voudrait rien dire. Verse dans la voix des textes de référence plus proches du registre mesuré. · calibration_mismatch — La version du moteur ne correspond pas à une calibration validée. Attends la correction de la configuration du moteur. Ne modifie ni ne traduis le texte pour contourner ce refus.",
      -      "enum": [
      -        "self_overlap",
      -        "unsupported_language",
      -        "voice_language_mismatch",
      -        "mixed_language",
      -        "embedding_layer",
      -        "out_of_distribution",
      -        "calibration_mismatch"
      -      ],
      -      "type": "string"
      -    },
      -    "version": {
      -      "type": "string"
      -    }
      -  },
      -  "required": [
      -    "question",
      -    "probability",
      -    "referenceLimited",
      -    "version",
      -    "dimensions",
      -    "dimensionsVersion"
      -  ],
      -  "type": "object"
      -}New value: +null
  2. First observed

TDQS

A4/5.0
Behavior1/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description says no account, no credits, and nothing stored, which implies no side effects, but the annotations declare readOnlyHint=false. That is a direct contradiction because readOnlyHint=false signals the tool is not read-only, while the description claims nothing is stored.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense and front-loads the core function before routing constraints and return behavior. It is longer than most definitions, but nearly every sentence carries operational information, with only minor tightening possible.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema and three parameters, the description carries the full burden and explains the return shape: calibrated probability, label, four stylometric dimensions, null/unavailable abstention, and the embedding_layer outage. It also covers prerequisites and alternatives, making it complete for an agent to call correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds useful semantic detail beyond the schema, especially the 150-word threshold for leaving low confidence. It also reinforces the exact sample count, word minimums, and register diversity, though it does not discuss the question enum.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: measures whether a text is by the same hand as three pasted reference texts. It also names the sibling it is not (verify_authorship), so an agent can distinguish it without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly frames the trial/no-account use case and contrasts it with verify_authorship, which requires an account and saved voice. It also states the conditions for the call: exactly 3 references, 100+ words each, different registers, and 50+ words for the target text.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources