ModelAtlas
A semantic AI model search and navigation server that lets you find, compare, and manage open-source AI models from HuggingFace and Ollama using structured scoring rather than keyword matching across 50,000+ indexed models.
navigate_models: Find models by specifying directional preferences across 8 banks (architecture, capability, efficiency, compatibility, lineage, domain, quality, training), with required/preferred/avoided anchors and similarity seeds — producing scored, ranked results without embeddings or GPUs.hf_search_models: Query models using natural language combined with filters like task, author, library, minimum likes/downloads, and fuzzy string matching.hf_get_model_detail: Retrieve a full semantic profile for a specific model including all 8 bank positions, anchor set, lineage links, certification score, and metadata.hf_compare_models: Diff multiple models showing shared anchors, unique features, Jaccard similarity scores, and per-bank position deltas.hf_build_index: Fetch and ingest models from HuggingFace or Ollama into the semantic network via the full certifier-enforced extraction pipeline.hf_index_status: View network statistics — total model count, anchor dictionary size, per-bank breakdowns, and source coverage.search_models: Query HuggingFace, Ollama, or all sources simultaneously and merge results.set_model_vibe: Attach a one-sentence vibe summary and optional extra anchor labels to a model for better recall.list_model_sources: View all registered source adapters and their availability status.phase_e_status: Monitor Phase E web enrichment progress — models enriched, benchmark scores found, anchor links added, and recent run history.
Allows ingesting models from Ollama into the ModelAtlas search index for discovery and navigation.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@ModelAtlasfind a small code model with tool-calling"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
ModelAtlas
Google for open-source AI models. Search by what you mean, not by keywords.
~51K models · 192 semantic anchors · certifier-enforced · <100ms queries · no embeddings · no GPU
You want a small code model with tool-calling. HuggingFace gives you the biggest, most popular code models:
Qwen2.5-Coder-32B-Instruct 32B 2,081 likes
Qwen3-Coder-480B-A35B-Instruct 480B 1,353 likes480B parameters is not small. HuggingFace sorts by popularity, and it cannot express "small" as a direction. ModelAtlas can:
navigate_models(efficiency=-1, capability=+1, quality=+1,
require_anchors=["code-generation"],
prefer_anchors=["tool-calling", "high-downloads"])jgebbeken/gemma-4-coder-gguf 3B | 3B-class, C++-code, GGUF-available 1.829
Qwen/Qwen2.5-1.5B-Instruct 1.5B | 3B-class, Qwen-family, base-model 1.813
deadbydawn101/gemma-4-E4B-Agentic-... 3B | 3B-class, Apple-Silicon, Gemma-family 1.808Every result is small, code-focused, and popular. One tool call, ~500 tokens, under 100 ms. efficiency=-1 is not a word to match. It is a direction in a coordinate system.
Four queries, both systems
HuggingFace is free and works. So the only case worth making is output you can compare, and every block below is a real HF API call and a real navigate_models call on the same intent. Nothing is illustrative.
The floor: ask for a task, get models that do the task
"A model that captions images."
HF pipeline_tag=image-to-text&sort=likes MA require=[image-understanding]
──────────────────────────────────────── ────────────────────────────────────────
1477 Salesforce/blip-image-captioning-large 2.037 Qwen/Qwen3.6-27B
931 nlpconnect/vit-gpt2-image-captioning 1.957 openai/clip-vit-base-patch32
865 Salesforce/blip-image-captioning-base 1.975 Qwen/Qwen2.5-VL-7B-Instruct
500 microsoft/trocr-base-handwritten 1.972 google/vit-base-patch16-224-in21k
477 numind/NuMarkdown-8B-Thinking 1.986 Qwen/Qwen3.6-35B-A3BBoth sides return real image models. That is the floor, and it is the least interesting thing here — but without it, nothing else counts.
Now read which models. HF's top three are BLIP and ViT-GPT2, 2021–2022 vintage. They lead because likes accumulate and never decay, so the ranking measures how long a model has been popular, not whether you should use it. ModelAtlas returns current VLMs. Qwen2.5-VL captions better than BLIP and has for a while. Nobody is going to un-like BLIP.
Direction: "small" is a coordinate, not a substring
"A small code model."
HF search="small code model"&sort=likes
────────────────────────────────────────────────────────────────
0 G-WOO/model_150mil-CodeBERTa-small-v1
0 penguinman73/codeparrot-model-small
0 Shawn156/models-small-codeparrot
0 codecfakev2/model_LA_WCE_4_14_1e-06_wavtokenizer_small_320_24k
0 BernardJoshua/codet5-small-text-to-sql-prompt-final_modelZero likes, every one. Strangers' abandoned checkpoints — and a wavtokenizer, an audio model, because "small" appeared in the filename.
MA efficiency=-1, require=[code-generation], prefer=[tool-calling, high-downloads]
────────────────────────────────────────────────────────────────
1.853 google/gemma-2-2b-it
1.823 DavidAU/gemma-4-E4B-it-The-DECKARD-Expresso-Universe
1.830 Abiray/gemma-4-E4B-it-heretic-GGUF
1.839 bartowski/gemma-2-2b-it-GGUF
1.825 google/gemma-2-2b-jpn-itefficiency=-1 is a direction in a coordinate system. It does not know what the word "small" looks like, and it does not need to.
Intent: you asked for code
"A code model I can run locally, in GGUF." Skip keywords and use HF's own structured filters — the strongest form of the query it supports:
HF filter=gguf&pipeline_tag=text-generation&sort=likes
────────────────────────────────────────────────────────────────
3375 google/gemma-7b ← not a code model
2713 yuxinlu1/gemma-4-12B-coder-fable5-composer2.5-v1-GGUF
1250 google/gemma-7b-it ← not a code model
1208 google/gemma-2b ← not a code model
933 google/gemma-2b-it ← not a code modelThe filter was honoured. The question was ignored. Four of the top five are general-purpose Gemma, because sort=likes cannot know you meant code. It only knows what is popular among things that survived the filter.
Choice: ten results, ten models
Same intent, by keyword:
HF search="code gguf"&sort=likes
────────────────────────────────────────────────────────────────
2713 yuxinlu1/gemma-4-12B-coder-...-GGUF
804 unsloth/Qwen3-Coder-30B-A3B-Instruct-GGUF
767 unsloth/Qwen3-Coder-Next-GGUF
595 DavidAU/Qwen3.6-40B-...-NEO-CODE-Di-IMatrix-MAX-GGUF
398 DavidAU/Qwen3.6-27B-...-NEO-CODE-Di-IMatrix-MAX-GGUF
396 DavidAU/GLM-4.7-Flash-...-NEO-CODE-Imatrix-MAX-GGUF
329 Jackrong/Qwopus3.6-27B-Coder-MTP-GGUF
325 Qwen/Qwen2.5-Coder-7B-Instruct-GGUF
309 Jackrong/Qwopus3.5-9B-Coder-GGUF
266 Qwen/Qwen3-Coder-Next-GGUFTen results, five publishers. DavidAU ×3, unsloth ×2, Jackrong ×2, Qwen ×2 — one person's merge recipe, three times.
MA require=[code-generation, GGUF-available], quality=+1
────────────────────────────────────────────────────────────────
1.339 huihui-ai/Huihui-gpt-oss-20b-BF16-abliterated
1.261 sweepai/sweep-next-edit-1.5B ← predicts your next edit
1.317 defog/sqlcoder-7b-2 ← writes SQL
1.287 bartowski/Codestral-22B-v0.1-GGUF
1.310 yuxinlu1/gemma-4-12B-coder-...-GGUF
1.290 stabilityai/stable-code-3b
1.261 TheBloke/phi-2-GGUF
1.258 prism-ml/Bonsai-4B-gguf
1.259 mradermacher/gemma-4-19b-a4b-it-REAP-i1-GGUF
1.289 FINAL-Bench/Darwin-28B-Coder-GGUFTen results, ten publishers, 1.5B to 28B. Two are specialists no keyword reaches: one writes SQL, one predicts your next edit. The scores are not in descending order, and that is the diversification working, not a bug. Score decides who makes the window; MMR decides the order within it, picking greedily on relevance × (λ − (1−λ)·similarity-to-everything-already-picked). So sweep-next-edit-1.5B at 1.261 is promoted above sqlcoder-7b-2 at 1.317 for being unlike the pick above it. The list spends its ten slots on ten models, not ten copies.
Honesty: it says when it can't rank
MA require=[code-generation, GGUF-available], prefer=[tool-calling, high-downloads]
────────────────────────────────────────────────────────────────
1.938 ─ huihui-ai/Huihui-gpt-oss-20b-BF16-abliterated
1.824 tie#0 ubergarm/Kimi-K2.6-GGUF axis=EFFICIENCY
1.830 tie#0 TheBloke/Mistral-7B-Instruct-v0.2-GGUF axis=EFFICIENCY
1.827 tie#0 bartowski/gemma-2-2b-it-GGUF axis=EFFICIENCY
1.805 tie#0 DavidAU/Qwen3.6-40B-...-NEO-CODE-MAX-GGUF axis=EFFICIENCYOne clear winner, then a band the engine declines to order. Your constraints do not separate them, so it will not pretend they do. Every ranked list you have ever used presented its arbitrary tail as a ranking. This one names the tie and names the way out:
"These range from -2 to +3 on EFFICIENCY, which is rather a wide field. Would you prefer smaller, or larger?"
{"answer": "smaller", "apply": {"efficiency": -1}}
Answer one word, merge the patch, the band resolves. How the refinement loop works →
Both systems clear the floor. Past it, every dimension that matters — recency, direction, intent, choice, and knowing what it does not know — needs coordinates, and a keyword index has none.
Related MCP server: Local Search MCP Server
What the LLM gets
ModelAtlas is an MCP tool. An LLM calls it mid-conversation, and one call returns a full profile:
{
"model_id": "jgebbeken/gemma-4-coder-gguf",
"score": 1.8292,
"score_breakdown": {
"bank_alignment": 1.0, "anchor_relevance": 1.0, "seed_similarity": 1.0,
"coherence": 1.0, "pagerank_boost": 1.0007, "soft_combined": 1.8292
},
"positions": {
"CAPABILITY": "+1", "COMPATIBILITY": "+2", "DOMAIN": "+2",
"EFFICIENCY": "-1", "LINEAGE": "+3", "QUALITY": "+1"
},
"anchors": ["3B-class", "C++-code", "GGUF-available", "Gemma-family",
"base-model", "chat-template-available"]
}From this the LLM immediately knows the model is small, code-focused, GGUF-packaged for local inference, and Gemma-derived. The anchors are a vibe. The positions are a profile. The score explains why this model and not another. Without ModelAtlas, the LLM guesses from stale training data. With it, the LLM has live, structured awareness of ~51K models for ~500 tokens — less than the cost of a follow-up question.
Approach | Latency | Tokens | Quality |
LLM guessing from training data | 0 ms | 0 | Stale, incomplete, no niche coverage |
HuggingFace API + parse | 2–5 s | ~2,000 | Tag filter + popularity sort |
ModelAtlas | <100 ms | ~500 | Scored, ranked, auditable, certifier-verified |
Refining a query
Because the coordinate system is explicit, the engine can tell you which coordinates you did not specify. Every response carries a refine block naming the highest-value unspecified dimension and the delta that answers it:
"refine": {
"question": "These range from +0 to +3 on DOMAIN, which is rather a wide
field. Would you prefer general knowledge, or domain-specialized?",
"options": [{"answer": "general knowledge", "apply": {"domain": 0}},
{"answer": "domain-specialized", "apply": {"domain": 1}}],
"scope_unfiltered": false,
"ranking_degraded": false,
"unspecified_axes": [{"bank": "DOMAIN", "range": "+0..+3", "spread": 1.2}]
}The caller merges apply into the arguments it already sent — scalars replace, lists append — and re-calls. No query rebuild. unspecified_axes ranks all eight banks by the variance actually present in the result window and drops any bank where every result agrees, so it never asks a question that would not narrow anything. Options come from the observed range, never a fixed ±1: a window at +0..+3 offers {"domain": 0} vs {"domain": 1}, because offering -1 would return an empty set. ranking_degraded: true means no prefer_anchors were passed, so three of the five soft signals score identically for every candidate — the window is filtered correctly but not meaningfully ordered, and it says so. scope_unfiltered: true is the same honesty one stage earlier: require_anchors is the only parameter that narrows the candidate set, so without it all 50,906 models are scored and limit just lops off the tail — the top slice of an unfiltered corpus, not the best of a considered field. One required anchor typically cuts the field by three orders of magnitude (require=["Java-code"] → 27 candidates), so it is asked first: no ordering signal repairs a field that was never narrowed. A keyword engine can offer none of this, because it has no coordinates to be missing.
How it works
Eight signed dimensions. Each has a zero state — the thing most queries assume by default.
ARCHITECTURE zero = transformer decoder → +novel (Mamba, MoE)
CAPABILITY zero = general language model → +rich (code, tools, reasoning)
EFFICIENCY zero = ~7B parameters → +larger / -smaller
COMPATIBILITY zero = PyTorch + transformers → +specific (GGUF, MLX)
LINEAGE zero = base/foundational model → +derived (fine-tune, quant)
DOMAIN zero = general knowledge → +specialized (code, medical)
QUALITY zero = established mainstream → +trending / -legacy
TRAINING zero = standard supervised (SFT) → +complex (RLHF, DPO) / -simplerOn top of coordinates, models share anchors — 192 semantic labels like tool-calling, GGUF-available, Llama-family. Similarity is emergent from shared labels, weighted by rarity (IDF). Nothing is an opaque embedding, and every score traces back to specific anchors.
Scoring is multiplicative: bank_alignment × anchor_relevance × seed_similarity × coherence × context_bias × epa_alignment × soft_combined. A model that nails efficiency but misses capability gets zero, not fifty percent. Wrong-direction models decay hyperbolically. Avoided anchors stack exponentially — each one halves the score. Required anchors are hard filters. The coherence factor is the certifier's per-model verification (below), and soft_combined folds the information-theoretic signals (PageRank, PMI-match, IDF-rarity, absence-bonus) together submodularly. Those signals reward rather than filter, so scores are not bounded at 1.0. The result is a surface that favours precise matches and eliminates mismatches fast, with no binary cutoffs. Full scoring math →
The audit pipeline: certifier-enforced anchor emissions
One discipline holds the whole corpus together: every anchor on a model must trace to a structural HuggingFace fact. Not "the LLM inferred it from the name." Not "the web scrape saw the word nearby." A rule fires on a specific HF field — pipeline_tag, model_type, library_name, quantization level, the safetensors index, config.json — and either requires an anchor or forbids one. The certifier lives at src/model_atlas/certifier/ and enforces at every write path: extract-and-store ingest, Phase E web-enrichment merge, and the retroactive recert tool.
HF raw_json Deterministic anchors (config.json → decoder-only, GQA)
│ │
▼ ▼
HFFacts ──────────────────► AnchorEmission[] (typed, immutable, with Provenance)
│
▼
certify() ── 43 declarative Rule objects
│
┌──────────────────┼──────────────────┐
▼ ▼ ▼
CERTIFIED REJECTED AUTO_ADDED
(write as-is) (Tier-1 veto) (rule required it,
extractor missed it)Rules are declarative data, not code:
Rule(
name="pipeline_image_text_to_text",
tier=RuleTier.STRUCTURAL,
trigger=lambda f: f.pipeline_tag == "image-text-to-text",
requires=("multimodal", "image-understanding"),
forbids=("image-generation",),
reason_template="pipeline_tag=image-text-to-text implies image UNDERSTANDING, not generation",
)43 rules across 8 categories cover the common structural implications, and their tier is their evidence trust. Tier 1 (STRUCTURAL) triggers on an HF-published field; a contradiction from a Tier-3 emission (LLM inference, web scrape) is REJECTED, non-negotiable. Tier 2 (SEMI-STRUCTURAL) is tag conventions and family names in the repo; a contradiction is DEMOTED. Tier 3 (INFERRED) is advisory; a contradiction emits a WARNING and the emission survives. Every model carries a certification_score, and 99.95% score ≥ 0.99 — no contradictions surfaced. The rest are surfaced in navigate_models as a soft tiebreaker: coherent evidence ranks above internally-contradictory evidence when all other constraints match. Two more guards keep the LLM honest. Before invoking the Phase C/E model, gating checks whether the deterministic tiers already cover ≥ 6 of 8 banks above the confidence floor, and skips the call if so — about 20% of them. And the Phase E worker is grammar-constrained: the Ollama call is schema-restricted to the bank's anchor vocabulary, so the model literally cannot emit an off-vocab or wrong-bank label.
Extraction — five phases, all certifier-enforced
Phases A–B — deterministic (confidence 1.0 / 0.85). Fetch from HuggingFace; classify from config files, tags, and safetensors metadata. Every anchor routes through the certifier before writing, so a pattern-inferred anchor that contradicts a Tier-1 fact (Falcon-family on a non-Falcon repo) is REJECTED at write time.
Phase C — constrained LLM (confidence 0.5). A local model reads each card and selects from the 192-anchor dictionary. It cannot invent labels — the output schema is the vocabulary. Invoked only where deterministic coverage is incomplete.
Phase D — audit and heal (confidence 0.6). Deterministic comparison of C anchors against Tier 1/2 ground truth. Since the certifier now enforces what Phase D once only audited, it is used mostly for coverage gaps.
Phase E — web enrichment (confidence 0.4). Searches the open web for signal HF does not publish — benchmark mentions, comparisons, community impressions — under the same constrained, grammar-restricted selection, routed through the certifier before merging.
All workers are standalone, zero-dependency scripts: scp to any machine, --resume from any crash, shard across as many machines as you have. Two maintenance tools keep the corpus fresh without a re-extraction: a retroactive recertifier (scripts/recertify_corpus.py) walks the whole DB and applies drops for contradictions and adds for missing implied anchors, idempotent and dry-run by default; and a targeted re-pull (scripts/repull_and_reextract.py) re-fetches fresh HF metadata for models the certifier flags as noisy, wipes their anchors, and re-extracts through the certified pipeline. docs/pipeline.md has the full command reference.
Quick start
# 1. Clone and install
git clone https://github.com/rohanvinaik/ModelAtlas.git && cd ModelAtlas && uv sync
# 2. Download the pre-built network (~51K models, all extraction tiers + certifier applied)
# Pinned to a release that carries the asset. `--fail` so an HTTP error is an
# error, not an error page silently saved as your database.
mkdir -p ~/.cache/model-atlas
curl -L --fail -o ~/.cache/model-atlas/network.db \
https://github.com/rohanvinaik/ModelAtlas/releases/download/v0.4.3/network.db{
"mcpServers": {
"model-atlas": {
"command": "uv",
"args": ["--directory", "/path/to/ModelAtlas", "run", "model-atlas"]
}
}
}Add that to any MCP-compatible client (Claude Code, Cursor, VS Code). Your LLM can now see model space.
Tools
Tool | What it does |
| Primary. Bank directions + |
| Full profile of one model: all 8 positions, anchors, lineage, |
| Structural diff between two models: shared/unique anchors, position deltas, Jaccard |
| Natural-language fallback with fuzzy matching when a structured query is not needed |
| Source-routed search — query one adapter (HuggingFace, Ollama) or fan out across all |
| Which model sources are registered and reachable |
| Ingest new models from HuggingFace or Ollama (certifier-enforced) |
| Network statistics: model count, anchor distribution, coverage |
| Set or update a model's vibe summary and extra anchors |
| Web-enrichment progress: enriched count, benchmark scores, recent runs |
What this is not
Not a vector store. No embeddings. Similarity comes from shared structure.
Not a HuggingFace wrapper. HF is a data source; the value is the extracted structure HF does not expose, plus the certifier that keeps it honest.
Not a leaderboard. There is no "best model" score. Navigation, not ranking.
Operational discipline
Every write to a canonical table goes through one of two audit-logged primitives in src/model_atlas/admin.py — patch_field (single-field update, dry-run by default, requires a sourced rationale) and insert_canonical (new row, same discipline). Worker JSONL ingestion routes through reconcile_file(), which dispatches via the same primitives with SHA-256 line-hash idempotency. Every anchor emission passes the certifier before it hits those primitives, and every successful write appends one line to data/patches.jsonl. See docs/admin.md, docs/reconciler.md, and docs/coherence.md.
Status
Around 51,000 models across 8 signed banks, on a closed vocabulary of 192 anchors and ~406K bank positions. 99.6% bank coverage. 43 declarative rules enforced at every write, 100% of models certifier-scored, 99.95% at perfect coherence. Models with fewer than 5 likes are not indexed — the corpus is the active, community-validated portion of HuggingFace, and it is a periodic snapshot: it tells you what to look at, not what is trending this minute.
Full docs | |
Pipeline reference | |
Design deep dive | |
Niche query showcase |
MIT — Rohan Vinaik
Available Tools
10 toolshf_build_indexA
Fetch models and add them to the semantic network.
Runs the full extraction pipeline: fetches models, extracts bank positions,
anchor links, and metadata, then stores everything in the network database.
This is additive — multiple calls enrich the same network.
Args:
category: Category label for this batch (e.g. "text-generation", "code")
task: HuggingFace task filter to scope models. If None, uses category.
source: Source to index from — 'huggingface' (default), 'ollama', or 'all'
limit: Max models to fetch (default 2000)
min_likes: Minimum likes threshold (default 5, only for huggingface)
force: Currently unused; network is always additive
| Name | Required | Description | Default |
|---|---|---|---|
| task | No | ||
| force | No | ||
| limit | No | ||
| source | No | huggingface | |
| category | Yes | ||
| min_likes | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses the full pipeline (fetch, extract, store), the additive behavior, and clarifies that the `force` parameter is unused. This provides good transparency for a mutation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the main purpose and pipeline summary. The parameter documentation is structured but slightly verbose. Overall, it efficiently conveys key information without excessive wordiness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity (6 params, no output schema details, sibling diversity), the description adequately covers behavior and parameters. It lacks explicit mention of return values, but an output schema exists to provide that.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Despite 0% schema description coverage, the description's docstring explains every parameter in detail, including relationships (e.g., `task` vs `category`), default behaviors, and source-specific constraints (e.g., `min_likes` only for HuggingFace). This adds significant value beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Fetch models and add them to the semantic network.' It details the extraction pipeline and distinguishes this from sibling tools focused on searching or retrieving single models.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description notes the additive nature ('multiple calls enrich the same network'), which indicates usage context. However, it does not explicitly state when not to use this tool or provide alternatives, leaving the agent to infer usage boundaries.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hf_compare_modelsA
Compare multiple models via anchor set operations and bank positions.
Shows shared anchors (intersection), distinguishing features (unique per model),
Jaccard similarity, and per-bank position deltas.
Args:
model_ids: List of model IDs to compare
| Name | Required | Description | Default |
|---|---|---|---|
| model_ids | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden of behavioral disclosure. It describes what the tool computes (intersection, Jaccard, deltas) but does not mention any side effects, authentication needs, rate limits, or response behavior beyond the listed outputs. The presence of an output schema mitigates some need, but the description lacks operational context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise, with a clear two-part structure: purpose and a list of outputs. It front-loads the main action. However, the args list duplicates the schema without adding value, slightly reducing efficiency.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity of comparing multiple models with multiple outputs (intersection, Jaccard, deltas), the description lists these outputs but does not define them or explain when they are useful. The existence of an output schema may fill some gaps, but the description itself is not fully self-contained.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the description must compensate for parameter details. It merely restates 'model_ids' as a list of model IDs, adding no constraints, formatting, examples, or semantics beyond the schema. This is insufficient for a tool with a single complex parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool compares multiple models via anchor set operations and bank positions, listing specific outputs like shared anchors, distinguishing features, Jaccard similarity, and per-bank position deltas. This distinguishes it from sibling tools like hf_get_model_detail or hf_search_models.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The tool's purpose is clear, but there is no explicit guidance on when to use it versus alternatives or when not to use it. The description implies comparison use cases but lacks when-not or exclusion criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hf_get_model_detailA
Get detailed information about a specific model.
Returns full semantic network profile (all 8 bank positions, anchor set,
lineage links, overflow metadata) if indexed. Falls back to HF API.
Args:
model_id: Full model ID (e.g. "meta-llama/Llama-3.1-8B-Instruct")
| Name | Required | Description | Default |
|---|---|---|---|
| model_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. It discloses the fallback behavior (HF API if not indexed) and outlines what is returned (bank positions, anchor set, etc.). It does not explicitly state it is read-only, but the context of a 'get' tool implies no destructive effects. Slightly above average due to fallback explanation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is very concise: two sentences total. The first sentence immediately states the main purpose, and the second adds behavioral details. No redundant or unnecessary words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description need not explain return values, but it still includes useful details about what the output contains. It covers the primary behavior and fallback. Lacks mention of side effects (none) or prerequisites, but given the simplicity of a read-only lookup, it is sufficiently complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so description must add meaning. It provides a concrete example of model_id format, which goes beyond the schema's type definition. This helps the agent understand the expected value format. Adding further constraints like allowed characters or length could push to 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Get detailed information' and the resource 'specific model'. It differentiates from siblings like hf_search_models and hf_compare_models by focusing on a single model ID lookup. The additional detail about returning semantic network profile or falling back to HF API further clarifies the purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use (get details for a specific model by ID) and provides a parameter example. However, it does not explicitly state when not to use or list alternatives among siblings, though the context of sibling tools makes the distinction reasonable. A more explicit exclusion would improve clarity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hf_index_statusA
Show the current state of the semantic network.
Returns total models, anchor dictionary size, per-bank breakdowns, and source coverage.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description details what the tool returns (total models, breakdowns, etc.), implying a read-only operation. Without annotations, it carries the transparency burden well, though it could explicitly state no side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with front-loaded purpose and explicit return list. No wasted words; every sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter tool with an output schema, the description adequately explains return values. However, it omits usage context (e.g., when the index is built or valid), which would help completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
No parameters exist (schema coverage 100%), so the description adds no parameter info. Baseline 4 is appropriate as the schema fully defines the interface.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose ('Show the current state of the semantic network') and lists specific return data (total models, anchor dictionary size, etc.), distinguishing it from sibling tools like hf_build_index or hf_compare_models.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool vs. alternatives such as phase_e_status or other read tools. Given the sibling context, explicit usage hints would improve selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hf_search_modelsA
Search HuggingFace models using navigational semantic network + fuzzy matching.
Combines three layers:
- Network: Bank-position constraints + anchor similarity (if models indexed)
- Fuzzy: String matching on model IDs, tags, descriptions
- Structured: HF API filters for task, author, library, popularity
Args:
query: Natural language search query (e.g. "small code model with tool-calling")
task: HuggingFace task filter (e.g. "text-generation", "text-classification")
author: Filter by model author/org (e.g. "meta-llama", "mistralai")
library: Filter by library (e.g. "transformers", "gguf", "diffusers")
min_likes: Minimum number of likes
min_downloads: Minimum number of downloads
limit: Number of results to return (default 20)
candidate_limit: How many candidates to fetch from HF API (default 500)
| Name | Required | Description | Default |
|---|---|---|---|
| task | No | ||
| limit | No | ||
| query | Yes | ||
| author | No | ||
| library | No | ||
| min_likes | No | ||
| min_downloads | No | ||
| candidate_limit | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses the three-layer search behavior (network, fuzzy, structured) and the combination approach. Since no annotations exist, it carries the full burden and does so well, though it misses details on rate limits, authentication, or potential side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with bullet points for the three layers and a clear Args list. However, the Args section is somewhat verbose and could be more concise without losing clarity. Overall, it earns its length.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity (8 params, 1 required) and presence of output schema, the description covers the search mechanism, all parameters, and examples. It lacks details on pagination, error handling, or return structure, but the output schema partly fills that gap. Adequate for most use cases.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the description's 'Args' section provides thorough explanations for all 8 parameters, including examples (e.g., 'small code model with tool-calling' for query), defaults, and context for filters like task and author. This fully compensates for the missing schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it searches HuggingFace models using a combination of three distinct layers (navigational semantic network, fuzzy matching, structured HF API filters). This specific verb+resource combination distinguishes it from sibling tools like search_models or navigate_models, which may use simpler approaches.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for semantic search but does not provide explicit guidance on when to use this tool versus alternatives (e.g., simpler search_models). No when-not or alternative tool mentions are included.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_model_sourcesA
List available model sources and their status.
Returns all registered source adapters with availability info.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. It discloses that the tool returns all registered source adapters with availability info, which is sufficient for a simple list operation. No hidden side effects or authorization details are needed for a read-only parameterless tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences with no wasted words. The purpose is front-loaded, and the second sentence adds useful information about the return value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no parameters and an existing output schema, the description adequately explains the tool's behavior and output. It covers what the tool does and what it returns, leaving no ambiguity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are no parameters, so the description adds no parameter details beyond the schema. Per guidelines, 0 params = baseline 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'list' and the resource 'model sources', with added detail about returning status. It distinguishes from sibling tools like 'search_models' and 'hf_get_model_detail' which deal with models, not sources.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the tool is for checking available sources, but it provides no explicit guidance on when to use it versus alternatives or any exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
phase_e_statusA
Show Phase E web enrichment progress and statistics.
Reports how many models have been enriched from web sources, benchmark scores found, anchor links added, and recent run history.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must fully disclose behavior. It lists the types of statistics shown (models enriched, scores, anchor links, run history) but does not mention data freshness, authentication needs, rate limits, or whether the operation is read-only. For a zero-parameter tool, more behavioral context would be helpful.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is only two sentences, front-loaded with the main purpose. Every word contributes meaning: the first sentence gives the overall task, the second lists specific outputs. No fluff or redundant statements.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has zero parameters and an output schema (present), the description is sufficient. It explains what the tool does and the main data it reports. The output schema presumably covers detailed return fields, so the description does not need to enumerate them. It is complete for a simple status tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are zero parameters, so the schema description coverage is 100% by default. The description does not need to add parameter semantics. However, it reinforces that no parameters are required, which is consistent.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states that the tool shows Phase E web enrichment progress and statistics. It specifies the resource (Phase E web enrichment) and the action (show). The description distinguishes this from sibling tools like hf_build_index or hf_compare_models, which are about building or comparing models, not reporting status.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description indicates a read-only status-check tool, but provides no explicit guidance on when to use it versus alternatives. No 'when to use' or 'when not to use' statements are included. The context implies usage for checking enrichment progress, but that is not stated directly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_modelsA
Search models across sources (huggingface, ollama, or all).
Uses source adapters to search model registries. When source='all',
searches all registered sources and merges results.
Args:
query: Search query string
source: Source to search — 'huggingface', 'ollama', or 'all'
limit: Maximum results to return (default 20)
task: Task filter (only applies to sources that support it)
author: Author filter (only applies to sources that support it)
| Name | Required | Description | Default |
|---|---|---|---|
| task | No | ||
| limit | No | ||
| query | Yes | ||
| author | No | ||
| source | No | huggingface |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, description discloses use of source adapters, merging for 'all', and filter applicability. It is clear about behavior but could mention pagination or error handling for completeness.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Description is front-loaded with a one-line summary, followed by a brief explanation of adapter behavior, and then a structured args list. Every sentence adds value and there is no wasted text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the presence of an output schema, return values need not be explained. The description covers core functionality, parameters, and special case ('all' merges). Could mention prerequisites like indexing, but overall adequate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so description bears full burden. It explains all 5 parameters (query, source, limit, task, author) with details on defaults and source-specific applicability, adding significant meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states 'Search models across sources (huggingface, ollama, or all)' and explains merging behavior for 'all'. This distinguishes it from sibling tools like hf_search_models which are Hugging Face-specific, giving a specific verb+resource purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Description implies when to use different sources (specific vs all) but does not explicitly exclude alternatives or state when not to use this tool. Sibling differentiation is implied but not explicit, so a score of 4 is appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_model_vibeA
Set the vibe summary and optional extra anchors for a model.
Called by the LLM after reading a model card or understanding a model's
characteristics. The LLM IS the NLP extraction tier — delegate vibes
extraction to the calling model rather than building NLP in Python.
Args:
model_id: Full model ID (e.g. "meta-llama/Llama-3.1-8B-Instruct")
vibe_summary: One sentence capturing the model's distinctive feel
extra_anchors: Optional anchor labels to add (e.g. ["tool-calling", "reasoning"])
| Name | Required | Description | Default |
|---|---|---|---|
| model_id | Yes | ||
| vibe_summary | Yes | ||
| extra_anchors | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, so the description must carry the full burden. It states the action (set vibe summary and extra anchors) but does not disclose side effects (e.g., whether it overwrites or appends), required permissions, or failure behavior. The meta instruction about who calls it is not behavioral transparency on the tool's operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is relatively well-structured with a clear opening sentence and bullet points for arguments. However, the paragraph about the LLM being the NLP extraction tier adds context but is not essential for tool invocation, making it slightly less concise than ideal.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers parameter semantics and usage context adequately. However, it lacks information about return values (though an output schema exists) and error conditions. For a tool with three parameters and simple behavior, the description is mostly complete but could improve with more behavioral details.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the parameter details in the description add significant value. For model_id, it provides a format example; for vibe_summary, it specifies 'one sentence capturing the model's distinctive feel'; for extra_anchors, it gives an example list. This goes beyond the schema's mere type definitions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Set the vibe summary and optional extra anchors for a model.' It also explains when it is used, distinguishing it from sibling tools that deal with searching, comparing, or indexing models.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says 'Called by the LLM after reading a model card or understanding a model's characteristics' and advises to 'delegate vibes extraction to the calling model rather than building NLP in Python.' This provides clear context on when to use the tool and when not to implement alternative logic, though it does not directly compare to sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.
1 tool update
v0.4.3- Changed
navigate_models2 fields changed- added
Input schema / properties / max_depthAdded value: +{ + "anyOf": [ + { + "additionalProperties": { + "type": "integer" + }, + "type": "object" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Max Depth" +} - added
Input schema / properties / min_depthAdded value: +{ + "anyOf": [ + { + "additionalProperties": { + "type": "integer" + }, + "type": "object" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Min Depth" +}
1 tool update
v0.4.1- Changed
navigate_models2 fields changed- added
Input schema / properties / bank_weightsAdded value: +{ + "anyOf": [ + { + "additionalProperties": { + "type": "number" + }, + "type": "object" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Bank Weights" +} - added
Input schema / properties / modeAdded value: +{ + "default": "auto", + "title": "Mode", + "type": "string" +}
1 tool update
v0.4.0- Changed
navigate_models1 field changed- added
Input schema / properties / context_anchorsAdded value: +{ + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Context Anchors" +}
10 tool updates
v0.2.0- First observed
hf_build_index - First observed
hf_compare_models - First observed
hf_get_model_detail - First observed
hf_index_status - First observed
hf_search_models - First observed
list_model_sources - First observed
navigate_models - First observed
phase_e_status - First observed
search_models - First observed
set_model_vibe
TDQS
Every tool has a clearly distinct purpose: core recommendation, HF search, detail, comparison, index building, status, generic search, vibe setting, source listing, and enrichment progress. No two tools overlap in function.
Tools follow a consistent verb_noun pattern with clear prefixes ('hf_' for HuggingFace, 'search_', 'set_', 'list_', 'navigate_'). The naming is predictable and descriptive.
With 10 tools, the server is well-scoped. Each tool earns its place, covering discovery, retrieval, comparison, management, and enrichment without unnecessary bloat.
The tool surface is complete for the server's purpose: navigating models (core recommendation), searching across sources, fetching details, comparing, building indexes, and adding metadata. No obvious gaps.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Hosted persistent memory with semantic search, importance and TTL for AI agents.
Search your knowledge bases from any AI assistant using hybrid RAG.
Universal persistent memory and knowledge retrieval layer for AI agents and LLMs.
11A collaborative substrate over your data: vector, knowledge graph, SQL, geospatial, streaming.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables AI assistants to search through structured databases and unstructured content (documents, videos, files) using natural language queries with semantic understanding.MIT
- AlicenseNot gradedqualityCmaintenanceEnables semantic search across indexed documents using vector embeddings. Index GitHub repositories and URLs to perform natural language queries with AI-enhanced contextual results.32MIT
- AlicenseAqualityDmaintenanceEnables AI assistants to perform intelligent semantic code search across codebases using local AI embeddings for meaning-based retrieval.639MIT
- AlicenseNot gradedqualityDmaintenanceEnables AI assistants to perform semantic, hybrid, and filtered search on indexed local documentation with RAG capabilities.2MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/rohanvinaik/ModelAtlas'
If you have feedback or need assistance with the MCP directory API, please join our Discord server