---
name: grantos
description: Use GrantOS CLI or MCP for funding discovery, cited private grant research, workspace context, and explicitly authorized grant workflow changes. Does not submit applications or authorize payments.
---

Use the installed `grantos` CLI with `--json`, or the hosted/local GrantOS MCP tools.
Hosted setup: add https://api.grantos.sh/mcp in the AI client and complete
OAuth in the browser. Never ask for pasted access tokens or invent a client ID.
Each connection covers one approved workspace; reads are the default and writes
need explicit consent. Manage connections at https://grantos.sh/connections.
The installer includes both `grantos` and `grantos-mcp` for local stdio use.

`grantos_help` is the connector's current safe command/flag catalogue; it runs
nothing. For a shell workflow, use `grantos commands --json` and command help.
The CLI is the implementation; do not recreate HTTP requests or bypass wrapper
restrictions with a shell.

For a funding decision, gather `context`, then search/filter the public funding
catalogue and workspace-private `knowledge search`. Preserve fund URLs,
document source URLs, excerpts, actual receipt dates, programme names, outcomes,
and warning fields. Report missing sections under `unavailable` and provider
warnings. An incomplete context is not proof that no records exist. Award caps,
reported grant amounts, payment receipts, and inferred eligibility are different
facts; do not collapse them or invent eligibility from similarity scores.

Use lexical search for exact words and semantic/hybrid retrieval for concepts
when the configured provider/index is available. Copy opaque page tokens exactly.
When a keyword response warns that it expanded to individual terms, its hits
are partial matches; inspect the excerpt before attributing a company, case,
amount or outcome. Use explicit quoted phrases or structured filters when
every term must be retained. Missing keyword results do not establish absence.
Use named flags and UUIDs returned by earlier results. Recommendation reads do
not save links; `fund record-workspace-suggestions` and
`fund record-project-suggestions` deliberately save them.

Use `knowledge context --query ...` for source-cited evidence and current review
state. `knowledge evidence analyze` pages through deterministic company, CVR,
case, date and amount candidates; exact-value groups can repeat forwarded or
copied evidence. Keep source receipt times separate from dates in the body.
Follow page tokens before claiming corpus-wide absence. Entity mappings require
an explicit accepted review with `--entity-key` and a reason. Preserve conflicting
CVRs and ambiguous judgments. A review is bound to the document content hash;
re-analyze changed sources. Do not manufacture reviewer acceptance or treat a
model match as an award, eligibility decision or bank settlement.

When available, `knowledge identity-matches --name ... --entity-kind company|person`
finds source-cited name variants, contacts and exact mentions. `--aliases` supplies
unverified search leads, not legal succession. Scores are rule rankings, not
identity probabilities. Follow source-page tokens even after an empty match page;
concurrent imports can shift offsets. Inspect source spans, mailbox ambiguity and
continued-text warnings. A suggestion's own ID is not a reviewable candidate ID.
Parsed contacts attach `evidenceCandidateId` and current `evidenceCandidate`
review state. After an explicit source-based judgment, review that candidate with
`person:slug`, accepted status and a reason; company/CVR keys cannot map contacts.
Ambiguous/rejected reviews omit entity keys. Shared mailboxes can identify several
people; preserve conflicting mappings. Retired sources reject new reviews and
continued contacts belong to part zero. This read never accepts mappings or merges
sources; importing contacts never supplies reviewer acceptance.

When extraction metadata includes `pdfRasters`, `uniformOpaque` describes exact
pixels at the recorded render resolution. For `imageOcr`, including on archive
members, `uniformRGBA` and `fullyTransparent` describe decoded pixels. Empty OCR
alone does not establish a blank page/image or absence of readable text. Fallback
confidence is a model estimate; inspect omitted-word counts and partial warnings
before relying on an amount, date or absent clause. Image fallback prose remains
partial even when all emitted words passed its confidence threshold. Retain
source links and current content hashes, and keep OCR output unreviewed until an
explicit source-bound judgment is recorded.

When extraction metadata includes `audio`, its timestamps are relative to the
recording. They are not receipt or decision dates, and no speaker identity is
established. Transcription remains partial and unreviewed even when the full
track was decoded. Check duration-limit warnings and verify names, amounts and
dates against the retained original; model hashes identify provenance, not
accuracy. Empty output does not establish silence. Segment byte spans address
the extracted text; for archive audio, add the member's `textStart` offset.
`audio_output_repetitive` quarantines dominant repeated segments; do not import
an older decoder-loop cache to work around it. This diagnostic needs source
inspection or a different profile and does not establish silence or word accuracy.

When extraction includes `spreadsheet`, inspect its sheet/cell counts, omitted
cells and `textLimited` before treating an absent value as missing from the
workbook. Text covers worksheet cells and retained formula source/attributes;
cached formula values are not recalculated or financially verified. Shared
formula references do not supply expanded formulas. Styles, formatted dates,
drawings, comments and macros are outside this projection. Follow continued
source parts for the complete emitted text and retain the original workbook.

When the installed catalogue includes `knowledge text get`, inspect a continued
source's `textManifest` and search-hit `textPartIndex`. The document body is its
bounded head; it is not the complete source. Read exact parts using the original
document UUID, content hash and part index. Preserve historical attribution and
receipt dates. `knowledge context` covers matched parts and verified boundary
context; page-wide evidence analysis covers the head with explicit warnings.
Continued prose candidates use `sourceField: text-part:N`; pass the same explicit
`--text-part-index N` for evidence review or ledger assertion proposal, including
zero for head claims. Byte spans can cross into verified next-part context.
Use the manifest to retrieve that context rather than inventing missing text.
MCP uploads require explicit writes and bounded stdin; larger local capture/import
operations remain CLI operator workflows.

When available, `ledger compare --application-id FIRST,SECOND --json` compares
2–10 explicit application UUIDs/keys discovered through paginated application
lists. It preserves current review/source state, distinct event occurrences,
money roles and unknowns. Only unique current reviewed values compare as equal
or different; the separate `citedClaimRelation` describes returned source claims
and never supplies acceptance. Inspect their assertion IDs, typed values and
review states. Several occurrences never sum. Different programme identities and
historical calls need original-context inspection. Research actions cite returned
assertion IDs and propose inspection, not eligibility, causation or submissions.
Follow event citation warnings into assertion/review pages. If the evidence or
2 MiB response bound is exceeded, select fewer cases. This read saves no advice
or judgments; unknown bank receipts remain unknown.

For v2 `knowledge evaluate` datasets, freeze source-based relevance labels before
searching. Explicit empty-result controls require a reason and are separate from
positive ranking metrics; they do not prove archive-wide absence or unsupported-
answer detection. Labeled distractors measure exposure, not answer misattribution;
unjudged documents are not automatically wrong. Report request failures and
source/model drift. Evaluation `complete` is execution status, not a quality gate.

When the installed command catalogue includes `ledger`, use it for explicit
company/programme/application relationships and individual proposed events.
Inspect `ledger application get`, `ledger event get` and `ledger timeline` before
changing history. Event names such as `decision_awarded` are proposed occurrences,
not verified outcomes. Timeline order is recording order; source receipt dates
remain separate. Preserve conflict, ambiguous, unreviewed and stale-source warnings.
`case_recorded` preserves drafts, withdrawals, conditional offers and other source
outcomes without inventing a submission or award. Its `recorded_outcome` is a
source claim, separate from assertion review status.

To attach a fact, analyze the original source and use `ledger assertion propose`
with its exact document UUID, content hash, candidate ID, explicit fact slot,
current event revision and a stable idempotency key. Proposals start unreviewed.
Review is an explicit reasoned judgment, never an ingestion side effect. Keep
award/amended caps, eligible expense, payment notices, bank-receipt claims and
repayment claims separate. Missing money is unknown; copied evidence is not a
second payment. Relative deadlines do not supply an absolute due date.

`ledger conflict resolve` selects current accepted assertions for one value;
it preserves disagreement/history and needs an explicit reason. Reload after a
stale revision/source error and inspect the change before writing. Retry successful
writes only with their original payload/key. Source updates preserve frozen history
but invalidate current acceptance. Event context has at most 50 citations: follow
paginated assertion/review lists for the full record. Do not fabricate acceptance,
bank reconciliation or company ownership while populating historical proposals.

Use `grantos_read` for side-effect-free commands. `grantos_write` requires explicit
user intent and backend authorization. Hosted connections also require approved
write scope; local stdio requires GRANTOS_MCP_ALLOW_WRITES=1. It may update
business state; do not use it merely to work around a read error. The server is
bound to its configured workspace. Do not switch tenants, mint credentials,
change configuration, install tools, read server files, or run operator commands
through MCP. Knowledge import can accept explicitly supplied typed NDJSON with
`--input -` and bounded tool `stdin`; a chat attachment path is not a server path.

A local CLI read credential expires after fifteen minutes and cannot refresh or delegate.
Hosted OAuth connections rotate access tokens and last up to thirty days; reconnect
through the client if authorization expires or is revoked.
On expiry, report that the local operator must supply a fresh credential. Never
request, print, or save token values in conversation. Local operator guidance is
in the distribution README; installing this skill grants no permission to send
messages, publish results, deploy services, move money, or submit applications.
