Particles
PYPI · LINKEDPARTICLES
An append-only ledger of sourced, dated, confidence-scored claims your agent cites and you audit
Available components
Last scanned (17 hours ago)
Scores higher than 86% of PyPI servers
Category Memory and Knowledge
How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. How we score → Why this is hard to score →
Supply Chain Security100
- No malware found by supply-chain analysis.Pass
- No known CVEs affecting this package version or its production dependencies.Pass
- Runs hatchling.build at install time, a recognised build step with no custom scripting around it. View diagnostics → Pass
- 8 of 113 dependencies flagged as unhealthy. View diagnostics → Partial
Provenance & Transparency100
- Source repository is publicly reachable at the declared URL. View diagnostics → Pass
- Cryptographically verified build provenance (signed, bound to LinkedParticles/particles-engine-py). View diagnostics → Pass
- Clear OSI-approved license (Apache-2.0).Pass
- Actively maintained (last published 2 days ago).Pass
- Publishes a security disclosure policy (SECURITY.md).Pass
Schema Quality & AI Usability56
- AI-judged instruction clarity (good).Pass
- Context-footprint check failed: tool/resource definitions use about 5143 tokens (~321/item across 16 items; 16 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
- Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management53
- Stability observed for 16 of 30 days with no destabilising changes; credit accrues until the full window elapses.Partial
Tool Coverage71
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 0% of tool parameters carry a description.Fail
- Structured output schemas are declared (100% of tools); any adoption earns full credit.Pass
Tool Safety100
- No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
- We read all 16 captured tool definition(s), and no name or description among them implies an irreversible operation.Pass
- An AI judge read all 17 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
- Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass
Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.
- 4 Nov 26 +15
- Malware scan: unverified → pass ▲ security
- 3 Nov 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 47 to 50. That category is still filling its 30-day observation window: 14 days of observed history at the previous scan, 15 at this one. The score rises as the window fills, whether or not the server changes.
- 2 Nov 26 −15
- Malware scan: pass → unverified ▼ security
- Package version: 1.210.2 → 1.224.6 functional
- 1 Nov 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 40 to 43. That category is still filling its 30-day observation window: 12 days of observed history at the previous scan, 13 at this one. The score rises as the window fills, whether or not the server changes.
- 31 Oct 26 +15
- Malware scan: unverified → pass ▲ security
- 30 Oct 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 33 to 37. That category is still filling its 30-day observation window: 10 days of observed history at the previous scan, 11 at this one. The score rises as the window fills, whether or not the server changes.
- 29 Oct 26 −15
- Malware scan: pass → unverified ▼ security
- 27 Oct 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 23 to 27. That category is still filling its 30-day observation window: 7 days of observed history at the previous scan, 8 at this one. The score rises as the window fills, whether or not the server changes.
Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.
Captured 4 Nov 2026 · Analysed pypi/linkedparticles@1.224.6
Provenance Verified
A signed build attestation was found and verified, binding this exact artifact to the source repository it claims to come from.
| Result | Verified |
|---|---|
| Ecosystem | pypi |
| Reason | Verified |
| Discovered via | Registry attestation endpoint |
| Source repo | LinkedParticles/particles-engine-py |
| Certificate issuer | https://token.actions.githubusercontent.com |
| Certificate SAN | https://github.com/LinkedParticles/particles-engine-py/.github/workflows/publish.yml@refs/tags/v1.224.6 |
| Rekor log index | 3636844727 |
| Predicate type | PyPI publish attestation https://docs.pypi.org/attestations/publish/v1 |
| Subject digest | sha256:de935557b2e805442b32d55fad7d8b4a67cbaa0211f989ae845e7124b3ced1c3 |
Background: How many MCP packages publish verified provenance →
Install scripts 1 script
| Hook | Tier | Command |
|---|---|---|
| build_backend | allowlisted | hatchling.build |
Background: Why install scripts are a supply-chain risk →
Dependencies 113 packages
| Packages resolved | 113 |
|---|---|
| Stale | 7 |
| No linked repository | 1 |
| Tree resolution | Complete |
Background: SBOMs and build attestations, explained →
The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →
corpus_links_suggest ~171
Rank undeposited URLs the corpus frequently cites (read-only). Surfaces primary sources the corpus leans on but has never deposited — "hearsay vs. primary source" gaps — ranked by trust-weighted distinct-source diversity × recency. Read-only: the ``dismiss`` half of the workflow lives on the CLI / HTTP API. Args: limit: Maximum suggestions to return. Defaults to ``citation_signal.rank_cap`` when omitted. min_sources: Minimum distinct citing sources required to surface a URL. Defaults to ``citation_signal.min_distinct_sources`` when omitted. Returns: ``{suggestions, total_candidates, capped}`` matching the ``DepositSuggestReport`` schema.
| Name | Type | Req | Description |
|---|---|---|---|
| limit | – | – | – |
| min_sources | – | – | – |
Structured output declared, but exposes no named fields.
No examples provided.
event_show ~41
Show one operator event in full — header, refs, and payload. Args: event_id: The event's id.
| Name | Type | Req | Description |
|---|---|---|---|
| event_id | string | yes | – |
Structured output declared, but exposes no named fields.
No examples provided.
events_list ~156
List operator events, newest first, optionally filtered. Args: particle: Only events touching this particle id. subject: Only events touching this subject id. corpus_entry: Only events touching this corpus entry id. (At most one of ``particle`` / ``subject`` / ``corpus_entry``.) event_type: Only events of this type, e.g. ``SOURCE_RETRACTED``, ``SUBJECTS_SPLIT``, ``TRUST_CHANGED``, ``REVIEW_RESOLVED``. limit: Maximum events to return (default 50).
| Name | Type | Req | Description |
|---|---|---|---|
| corpus_entry | – | – | – |
| event_type | – | – | – |
| limit | integer | – | – |
| particle | – | – | – |
| subject | – | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | array | yes | – |
No examples provided.
graph_view ~741
Render one scoped epistemic subgraph of the particle store. Scope is mandatory — pass exactly one of ``subject_id`` / ``query`` / ``inconsistency_id`` / ``manifest``+``section`` (a whole-store render does not exist; the anti-hairball invariant). Every epistemic quantity in the result (effective confidence, contested badges, as-of visibility, utility evidence) is computed at render time by the engine and never stored. Args: subject_id: Neighbourhood scope — this Subject, its particles, and subjects reachable within ``hops`` via multi-subject particles. Accepts a subject id or an exact (case-insensitive) canonical name / alias; the render's ``scope_ref`` is the resolved id. query: Retrieval-set scope — the top-K hits of the existing query ranking rendered as their subjects plus the hit particles ("the picture of the knowledge the agent consulted"). inconsistency_id: Evidence scope — a contradiction's picture: the INCONSISTENCY particle as the anchor, its two disputant beliefs shown with their true statuses (the quarantined side included), their subjects and sources. Accepts a full particle id or a unique prefix (a contested badge's ``inconsistency_id`` is the usual source). manifest: With ``section``, projection scope — an manifest section's deterministic selection rendered as a graph. The manifest is a relative name under the engine's ``graph.manifest_root``; with that unset the scope is refused. section: The manifest section's ``region`` id, or its exact (case-insensitive) title. hops: Neighbourhood radius for subject scope (clamped to ``graph.max_hops``). history: Also include retired supersession-chain ancestors, rendered as ghosts. as_of: ISO-8601 past instant (a bare date means start of that day, UTC): render the graph as believed at T. A future instant is rejected. max_nodes: Per-c…
| Name | Type | Req | Description |
|---|---|---|---|
| all_projects | boolean | – | – |
| as_of | – | – | – |
| history | boolean | – | – |
| hops | integer | – | – |
| inconsistency_id | – | – | – |
| manifest | – | – | – |
| max_nodes | – | – | – |
| query | – | – | – |
| section | – | – | – |
| store | string | – | – |
| subject_id | – | – | – |
Structured output declared, but exposes no named fields.
No examples provided.
links_suggest ~230
Propose co-evidential candidate pairs within Subjects (read-only). Within each Subject, ACTIVE particles whose embeddings exceed the similarity threshold and are not already linked CO_EVIDENTIAL are surfaced as candidate pairs for operator review. No LLM call, no mutation — this is the ``REPORT`` mode of ``particles links suggest``. Args: subject_id: Restrict to one Subject. ``None`` scans every Subject — prefer passing a ``subject_id`` to keep results focused. threshold: Cosine-similarity floor (0.0–1.0). Defaults to ``links_suggest.candidate_threshold`` when omitted. limit: Maximum candidate pairs to include across all clusters (default 100). A ``truncated`` flag is added when the cap fires. Returns: ``{run_at, mode, clusters, total_candidates, warnings}`` matching the ``SuggestReport`` schema, optionally with ``truncated: True``.
| Name | Type | Req | Description |
|---|---|---|---|
| limit | integer | – | – |
| subject_id | – | – | – |
| threshold | – | – | – |
Structured output declared, but exposes no named fields.
No examples provided.
lint ~326
Run structural lint checks over the particle store (no fixes, no LLM). The MCP surface is read-only, so ``--fix`` is forced off and the LLM-assisted semantic checks are disabled — agents read findings and surface them to the operator, who decides whether to act. Args: category: Optional ``finding_type`` filter (e.g. ``STALENESS``, ``PHANTOM_SUBJECT``, ``WIKIDATA_LINK_MISMATCH``). When set, only findings of that kind are returned; ``summary`` is always the full counts dict and reflects every category actually emitted by this run. summary_only: When ``True``, drop the ``findings`` list and return only the ``summary`` counts dict (plus ``run_at``). Useful when the agent only needs to know what *kinds* of problems exist before drilling in with ``category``. limit: Maximum findings to include after filtering (default 100). Hard cap to keep the response under per-tool-result size limits even when many findings of one category exist. A ``truncated`` flag is added when the cap fires. Returns: ``{run_at, findings, summary}`` matching the ``LintReport`` schema, optionally with ``truncated: True`` and (when ``summary_only``) without the ``findings`` key.
| Name | Type | Req | Description |
|---|---|---|---|
| category | – | – | – |
| limit | integer | – | – |
| summary_only | boolean | – | – |
Structured output declared, but exposes no named fields.
No examples provided.
list_corpus_entries ~71
List recent corpus entries (most-recently-deposited first). Args: limit: Maximum entries to return (default 50). source_type: Optional filter (e.g. ``"WIKIDATA_API"``).
| Name | Type | Req | Description |
|---|---|---|---|
| limit | integer | – | – |
| source_type | – | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | array | yes | – |
No examples provided.
list_taxonomies ~112
List every taxonomy + its full tag tree. Args: limit: Maximum taxonomies to return (default 50). Each taxonomy embeds its full tag tree, so even a handful of large taxonomies can push the response past the per-tool-result token cap. offset: Number of taxonomies to skip before returning results (default 0). Results are ordered by name so pagination is stable.
| Name | Type | Req | Description |
|---|---|---|---|
| limit | integer | – | – |
| offset | integer | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | array | yes | – |
No examples provided.
particle_search ~171
List particles sharing a context fingerprint. Args: fingerprint: Full 64-char SHA-256 hex or a prefix (≥ 8 chars). limit: Maximum particles to return (default 50, capped at 200 to keep responses within MCP per-tool-result token caps — fingerprint matches share full ``content`` strings). all_projects: On a server bound to one project, read the whole store instead of that project's view. The result says so. No effect on an unbound server. Returns: Dict with ``fingerprint`` (the queried value) and ``particles`` (list of ``{id, status, content}`` summaries).
| Name | Type | Req | Description |
|---|---|---|---|
| all_projects | boolean | – | – |
| fingerprint | string | yes | – |
| limit | integer | – | – |
Structured output declared, but exposes no named fields.
No examples provided.
particle_show ~159
Show one particle with its provenance, subjects, and tags. Args: particle_id: Full UUID or unambiguous prefix (≥ 8 chars). Returns: Dict with ``particle`` (Pydantic JSON), ``subjects`` (list of ``{id, canonical_name}``), and ``provenance`` (list of ``{type, corpus_entry_id, uri_r, source_type, snapshot_id}``). When the source now states the claim in other words, ``restated_as`` holds that wording and its snapshot; the claim's ``content`` keeps its first wording. Raises if the prefix matches zero or multiple particles.
| Name | Type | Req | Description |
|---|---|---|---|
| particle_id | string | yes | – |
Structured output declared, but exposes no named fields.
No examples provided.
particles_list ~520
List particles, optionally filtered by status or subject. Lightweight alternative to ``query`` and ``lint`` when an agent just needs the IDs of particles in a particular state — e.g. the open INCONSISTENCY queue, RETRACTED particles for cleanup, or every ACTIVE particle linked to a subject. Embeddings are never included; responses are designed to stay within MCP tool-result size caps. Args: status: Optional status filter — one of ``ACTIVE``, ``SUPERSEDED``, ``RETRACTED``, ``PROVENANCE_STALE``, ``INCONSISTENCY``. Unset returns particles in any status. subject_id: Optional subject: a full ID, an ID prefix, or a name or alias, resolved as ``subjects_show`` resolves it. When set, only particles linked to that subject via the ``particle_subjects`` join table are returned, and the result echoes the resolved ``subject_id``. A reference that matches no subject, or more than one, raises. limit: Maximum particles to return (default 50). Must be > 0. offset: Number of particles to skip before returning results (default 0). Combine with ``limit`` to page through the full set. all_projects: On a server bound to one project, read the whole store instead of that project's view. The result says so. No effect on an unbound server. Returns: Dict with ``particles`` — a list of summary dicts containing ``id``, ``status``, ``content``, ``confidence``, ``subject_ids``, ``asserted_at``, and ``status_reason``. Each entry's ``contested`` key is the id of an open INCONSISTENCY referencing it, else null; ``contested_bases`` rides beside it with the fired basis labels — composed by the same composer the ``query`` tool uses, so all three bases (stance / divergence / inconsistency) are evaluated and the two surfaces on one server always agree. Plus ``limit``/``offset`` echoed back so the agent can drive pagination. Embeddings are inte…
| Name | Type | Req | Description |
|---|---|---|---|
| all_projects | boolean | – | – |
| limit | integer | – | – |
| offset | integer | – | – |
| status | – | – | – |
| subject_id | – | – | – |
Structured output declared, but exposes no named fields.
No examples provided.
quality_report ~106
Return the extraction-quality dashboard snapshot. Particle counts by status / calibration_source / schema_version, plus the structural-mix percentages, the store's recorded LLM spend (``llm_spend``), and the curation queue's precision over the default window (``curation_precision``: per card kind, the cards acted on, dismissed, snoozed and untouched, with the denominator). Computed entirely from live DB queries — no LLM involvement.
Input schema present but exposes no named parameters.
Structured output declared, but exposes no named fields.
No examples provided.
query ~1,478
Run a tag-aware semantic query against the particle store. Args: question: Natural-language question. Optional since: omit it and set structural claim filters (or an aggregate / the predicate listing) for the deterministic modes — no embedding, no LLM call. tags: Subtree-expanded tag filters, repeatable. subject_id: Restrict to particles about this subject. min_confidence: Minimum confidence value (0.0–1.0). top_k: Number of particles to retrieve (1–200). audience: "GENERAL" | "EXPERT" | "REGULATORY". summary: When ``True``, each hit in ``particles`` is reduced to ``{id, content, confidence, effective_confidence, subject_ids}`` — provenance, tags, properties, and embeddings are dropped. The NL ``answer`` string and coverage gaps are unchanged. Use this when the agent only needs to surface the answer and pick particles to ``particle_show`` later. Default ``False`` preserves the full ``QueryResponse`` shape for backward compatibility. as_of: ISO-8601 past instant (a bare date means start of that day, UTC): answer what the store believed at T. Retired hits carry an ``as_of_notes`` entry (current status, retirement instant + basis, and the superseding belief); ``as_of_excluded_undatable`` discloses retirements the store cannot date. A future instant is rejected. during_start: With ``during_end``, a window of world time (ISO-8601 dates, inclusive; either may be omitted for an open end): answer about what began in, or was in force during, that period. The window prefilters the candidate set before ranking; with no question it returns the claims in date order, each with a ``window_hits`` reading (``BEGAN``, ``IN_FORCE``, ``HELD_AT``, ``WITHIN``). A retired claim is admitted for the period it held, marked with its retirement and its close. Reads ``valid_from``; ``…
| Name | Type | Req | Description |
|---|---|---|---|
| all_projects | boolean | – | – |
| as_of | – | – | – |
| audience | string | – | – |
| count | boolean | – | – |
| during_end | – | – | – |
| during_start | – | – | – |
| grounded | – | – | – |
| group_by | – | – | – |
| list_predicates | boolean | – | – |
| min_confidence | number | – | – |
| min_effective_confidence | – | – | – |
| object_contains | – | – | – |
| object_eq | – | – | – |
| object_gt | – | – | – |
| object_lt | – | – | – |
| on | – | – | – |
| predicate | – | – | – |
| question | – | – | – |
| subject_id | – | – | – |
| summary | boolean | – | – |
| tags | – | – | – |
| top_k | integer | – | – |
Structured output declared, but exposes no named fields.
No examples provided.
subjects_list ~187
List subjects in the knowledge graph (alphabetical by canonical_name). Paginated to keep responses within an MCP-client-friendly size — the full subject set can easily exceed per-tool-result token caps. Args: limit: Maximum subjects to return (default 50). offset: Number of subjects to skip before returning results (default 0). Combine with ``limit`` to page through the full set. order: ``"name"`` (alphabetical, default) or ``"degree"`` — most-connected first, by descending count of ACTIVE particles linked to each subject (name tie-break). Use ``"degree"`` to find a store's hub subjects, e.g. as a ``graph_view`` starting scope.
| Name | Type | Req | Description |
|---|---|---|---|
| limit | integer | – | – |
| offset | integer | – | – |
| order | string | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | array | yes | – |
No examples provided.
subjects_search ~144
Substring search over subject names and aliases (case-insensitive). Args: query: Substring to match against ``canonical_name`` or any recorded alias, so "speaker" finds a subject whose alias is "the speaker". limit: Maximum subjects to return (default 50). A generic substring like "the" can match thousands of subjects, so this caps the page size. offset: Number of matches to skip before returning results (default 0). Results are alphabetical by canonical_name so pagination is stable.
| Name | Type | Req | Description |
|---|---|---|---|
| limit | integer | – | – |
| offset | integer | – | – |
| query | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | array | yes | – |
No examples provided.
subjects_show ~264
Show one subject with the particle IDs linked to it. Args: subject_id: A full UUID, an unambiguous prefix (≥ 8 chars), or a name or alias, matched case-insensitively and exactly. A reference that matches more than one subject (a prefix shared by several IDs, a name two subjects share, or a string that is both a prefix and a name) raises with the candidates named. A remote engine resolves IDs and prefixes only. particle_id_limit: Maximum particle IDs to include in ``particle_ids`` (default 100). For hot subjects the full list can blow the per-tool-result token cap; use ``particles_list(subject_id=…, limit=…, offset=…)`` for the full set when ``particle_count > particle_id_limit``. Returns: Dict with ``subject`` (Pydantic JSON), ``particle_ids`` (capped at ``particle_id_limit``, ordered by id for stable pagination), and ``particle_count`` — the true total of linked particles, so callers can detect when the list was truncated.
| Name | Type | Req | Description |
|---|---|---|---|
| particle_id_limit | integer | – | – |
| subject_id | string | yes | – |
Structured output declared, but exposes no named fields.
No examples provided.
How do I install the Particles MCP server?
Particles runs locally as a PyPI package, launched with uvx linkedparticles. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.
pypi · linkedparticles
claude mcp add org-linkedparticles-particles -- uvx linkedparticles
What is the Particles MCP server?
Particles is an MCP server listed in the public MCP registry as org.linkedparticles/particles. An append-only ledger of sourced, dated, confidence-scored claims your agent cites and you audit. This page covers its PyPI package (linkedparticles).
Is the Particles MCP server safe to use?
Particles scores 83 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 4 November 2026. Its build provenance is signed and verified. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.
What tools does the Particles MCP server expose?
Particles exposes 16 tools: query, particle_show, particles_list, particle_search, subjects_list, and 11 more. Their descriptions and schemas cost roughly 4,877 tokens of context every time the server is loaded.
Is the Particles MCP server still maintained?
Particles is still listed as active in the MCP registry. We last reached this channel on 4 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.
What licence is the Particles MCP server under?
Particles declares the Apache-2.0 licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.