Skip to Content
FeaturesAI Agent Access (MCP)

AI Agent Access (MCP)

ArchRepo supports the Model Context Protocol (MCP) , allowing you to connect AI agents such as Claude Desktop or Cursor directly to your project’s architecture model.

Once connected, your AI agent can browse model items, read architectural narratives, explore the metamodel, and navigate relationships — all using your own ArchRepo identity.

MCP access is disabled by default. A project admin must enable it in Project Settings before any AI agent can connect.

Prerequisites

Before connecting, make sure you have:

On first connection, your AI agent will open a browser window asking you to sign in with your ArchRepo account.

Connecting with Claude Desktop, Cursor, Windsurf, or other MCP clients

Use the Streamable HTTP transport URL:

https://archrepo.com/api/mcp

If your client only supports the legacy SSE transport, use:

https://archrepo.com/api/sse

Your MCP client will prompt you to sign in with your ArchRepo credentials when it first connects.

Ask — the built-in AI assistant

You don’t need an external MCP client to get AI help with your architecture — Ask is ArchRepo’s own built-in AI assistant, available directly inside the app. It draws on the same read-only tools described below (model items, tasks, metamodel, dependency graphs, and more), so you can ask it questions in plain language without connecting anything.

Ask also has one capability the external MCP tools don’t: it can answer questions about a delivery team’s tasks directly — for example, “find me all tasks assigned to the BA Team”. See Finding a delivery team’s tasks below for how it decides which tasks belong to a team, and how to word the team’s name so it finds the right one.

Completion, blocking & impact questions

Ask can also answer three question shapes about where a project’s specifications stand, without you needing to know which lens applies:

  • “What’s the plan? What’s the bottleneck? What can start now?” — Ask returns a build sequence: the ordered layers of work, the critical path driving the overall timeline, the biggest bottlenecks, and any blockers or coverage gaps standing in the way. Ask about a specific milestone to scope the answer to just that milestone’s items.
  • “Why is X blocked? What is X still waiting on?” — Ask explains exactly what’s holding one item back: an upstream item it reads from that hasn’t been approved yet, an open Issue or undecided Design Decision it references, another unsettled dependency, or being caught in a dependency cycle.
  • “What slips if X is blocked or deferred?” — Ask reports the downstream impact of one item staying blocked (or being deliberately deferred): which items are directly held up by it, which are only delayed with some runway before it bites, and — if X sits on a dependency cycle — which items only look affected because they share that cycle, not because they’re genuinely downstream of it.

Every answer states which lens it’s under — design completeness, build/develop sequencing, or data availability — since the same question can have a different answer depending which one you mean (see Specification Completeness & Dependency Lenses below). These answers are read from the exact same underlying dependency derivation as the Build tab and the tools below, so Ask, the Build tab, and an external AI agent connected via MCP never disagree with each other. Any item Ask names as a blocker is a clickable link straight to that item.

Ask will tell you when it isn’t confident enough to give you a sequence. Every plan-style answer carries a confidence level based on how much of the critical path has real data-mapping evidence behind it (see Specification Completeness below). If that evidence is too thin, Ask won’t present a guessed-at sequence — it will say plainly that the plan can’t be sequenced reliably yet and list what needs mapping first. If the evidence is borderline, Ask still presents a sequence but leads with the gaps (and any dependency cycle) that make it provisional, rather than presenting it as settled. This is deliberate: a confident-sounding answer built on too little real data is worse than an honest “not sure yet.”

Available Tools

Once connected, your AI agent has access to the following tools:

Refs are accepted everywhere an item ID is expected. Every tool that takes a modelItemId (or itemAId / itemBId / sourceItemId / targetItemId / milestoneId / dataSetId) accepts either a human-readable ref like "FR021", "FR-021", or "NFR-102" (case-insensitive, hyphens optional) or a 24-character Model Item ID. Refs are strongly preferred — they remove a class of transcription error where an AI agent can pair the wrong Model Item ID with an item it found in a list. Write tools also echo the resolved item (ref, name, type) in the response so you can verify exactly which item was changed.

Responses carry their own reading instructions. Several tools attach a caveats array to the response — short, structured notes telling the agent how to read a particular field of that result. Each entry is { code, appliesTo, guidance }: a stable code (so a client can suppress guidance it has internalised), the response field the note is about, and the guidance itself.

They are emitted conditionally: a graph with no cycles carries no cycle guidance, a response with no coverage block carries no coverage note. This keeps the interpretation rules with the data they apply to, rather than in the tool manifest every session pays for whether or not it calls the tool. The long-form version of every caveat is on this page, in the section for the tool that raises it.

Discovery

ToolDescription
list_my_projectsReturns all your MCP-enabled projects with their IDs and names. Start here — your agent calls this automatically to discover which projects are available.
fetch_project_usersReturns the sanitised list of users who are members of a project (including org admins). Fields: name, shortName (if set), email, avatarUrl (if set). Use this before assigning a task — your agent will present the list and confirm your choice.

Your agent calls list_my_projects first to discover available projects. You can then refer to a project by name — for example, “look at the Platform project” — and the agent will use the correct IDs automatically.

Metamodel

ToolDescription
get_metamodel_typesLists all architecture item types defined in your project’s metamodel, with their descriptions and concerns.
get_metamodel_type_detailsReturns the full specification for a single type, including its properties, allowed relationships, and flags. Each relationship entry includes isBuildOrderDependencytrue when that relationship type represents a genuine construction/build-order dependency (e.g. supports, uses, has Read/Write Access to, contains, has, depends on), false for informational or data-flow relationship types (e.g. generates, triggers, represents). “Build” here means develop-and-test — what needs to exist before something else can be developed and tested — not data-availability or end-to-end enablement order; data-flow relationships are excluded even though they can gate when an item can actually be exercised end-to-end. Use this flag to tell your agent which connections form the real build sequence when it is reasoning about sequencing. The flag is type-level: it confirms the relationship type is dependency-shaped for that (type, target) pair, and says nothing about the direction of any particular instance — see the outbound/inbound distinction in get_all_model_item_relationships and get_valid_relationships.

Concern Overviews

ToolDescription
get_concern_overviewReturns the complete overview for one of the 8 architectural concern areas (Project, Business, Apps & Systems, Data, Technology, Build, Transition, Operations). Includes the concern-level narrative and, for each topic section, the topic narrative and a list of model items of that type — up to the configured limit per topic (default 10). Each topic includes a hasMore flag and the metamodelType for pagination via list_model_items. Use this to get a high-level picture of any concern area before diving into individual items.

Model Items

ToolDescription
list_model_itemsLists items of a given type within your project, with status, readiness score, and key metadata. Supports pagination via limit and offset parameters — the response includes a pagination object with a hasMore flag. Pass summary: true for a lightweight response per item (id, ref, name, type, status, updatedAt, link) that leaves out the readiness score breakdown — useful when an AI agent is scanning many items at once and only needs to identify them, not analyse their readiness in detail.
get_model_itemReturns a summary of a model item by ID: core metadata and the full readiness score breakdown. This is a subset of all fields — use get_all_model_item_properties for the complete document.
get_all_model_item_propertiesReturns all stored properties of a model item: type-specific fields (risk scores, assumption status, design decisions, FMEA analysis, API protocols, etc.), transition states, approval fields, data mappings, PlantUML diagrams, external references, and the pre-computed readinessScore. Does not include relationships — use get_all_model_item_relationships for connections. Excludes narrative (use get_model_item_narrative) and DataSet entity diagrams (use get_data_set_schema).
get_model_item_narrativeReturns the full architectural narrative for a model item as readable Markdown. This includes design decisions, pipeline descriptions, assumptions, TBDs, and embedded diagrams. See Narratives & Diagrams below.
get_model_item_specReturns the complete specification as Markdown, exactly matching the on-screen specification tab. Includes: summary properties, full narrative, all outbound and inbound relationships with properties, external references, approval data, and (for DataSets) the full data model. Recommended for comprehensive single-call retrieval.
search_model_itemsFuzzy full-text search across all model items in a project. Returns up to 30 results ranked by relevance with highlighted match snippets. Searches name, ref, description, external references, relationships, transition states, and more. Optionally filter by ofType. Use this when you don’t know an item’s exact ID.

Data Sets

ToolDescription
get_data_set_schemaReturns the complete entity model for a Data Set: all entities (tables, CSV, JSON, XML, Text, Type definitions) with full attribute definitions including field names, types, constraints, and examples; all relationships between entities with cardinality; and a Mermaid ERD diagram.

Tasks

ToolDescription
fetch_my_tasksReturns your tasks across all projects, sorted by progress then due date. Defaults to active tasks (To Do + In Progress). Accepts optional filters: progress status, concern area, project, Project Increment, date range, and linked specification item. Each task includes its notes and any linked specification items.
fetch_project_tasksReturns all tasks in a project across all assignees, sorted by progress then due date. Requires orgId and projectId. Defaults to active tasks (Backlog, To Do, In Progress, Blocked) — Done and Cancelled are excluded by default unless explicitly passed via the progress filter. Each task includes the assignee, notes, and linked specification items. Use this for project-wide task audits and reporting. Pass the optional team parameter to scope the results to one delivery team — see Finding a delivery team’s tasks below.
get_item_task_summaryReturns open and total task counts for a model item across all project members — not scoped to the current user. Use this for project-wide readiness reporting where fetch_my_tasks is insufficient. Accepts an optional progress filter to control which states count as “open” (default: To Do, In Progress, Blocked).
fetch_task_detailsReturns the complete detail view of a single task — all properties plus fully resolved relationships: Project Increment, delivery team, releases, tasks this task depends on, tasks blocked by this task, and linked specification items (requirements, systems, risks, etc.). Call this before updating a task to see the current state.
update_taskUpdates a task’s properties and relationships in a single call. Supports: progress, completion percentage, notes, assigned user, estimation, dates, name, and description. Also handles relationship changes — setting a PI, team, or release, adding or removing dependencies, and linking or unlinking specification items. Setting progress to Done automatically sets completion to 100%. Requires Editor role. Your AI agent will show you a clear Before / After summary and ask you to confirm before making any changes.
update_task_progressUpdates a task’s completion percentage (0–100). Setting to 100 marks the task as Done; setting to 1–99 moves a non-Blocked task to In Progress. Optionally appends a timestamped progress note. Requires Editor role. Your AI agent will show a Before / After summary and ask you to confirm before making any changes.
update_task_statusUpdates a task’s status (Backlog, To Do, In Progress, Done, Blocked, Cancelled). Use this to mark a task as Blocked when it cannot proceed. Setting to Done automatically sets completion to 100%. Requires Editor role. Your AI agent will show a Before / After summary and ask you to confirm before making any changes.
create_taskCreates a new task with an auto-generated reference (e.g. TODO042). Optionally links the new task to a PI, team, release, dependency tasks, and specification items — all in one step. Requires Editor role. Your AI agent will describe the task it is about to create and ask you to confirm before proceeding.
set_task_orderSets your preferred order for a reorderable My Tasks section (In Progress, To Do, or Backlog). Pass the full ordered list of task IDs — the stored order is replaced. Changes are personal and not visible to other project members.
add_focus_nowAdds a task to your personal Focus Now shortlist on the My Tasks dashboard. The list has a soft limit of five — the tool warns if exceeded but still adds the task. Returns without changes if the task is already pinned. Changes are personal and not visible to other project members.

Finding a delivery team’s tasks

Both fetch_project_tasks (team parameter, above) and Ask — via its own fetch_team_tasks tool — can scope a task list to a single delivery team. Both follow the same rule, so the answer always matches what you’d see on that team’s Tasks tab in ArchRepo:

  • A task is included if the team owns it directly, or if it’s assigned to a member of that team and no other team.
  • A task assigned to someone who belongs to more than one delivery team, with no explicit team assignment, is left out — attributing it to one team over another would just be a guess. Instead, the response includes a summary (or, for Ask, a plain-language note) stating how many such tasks were excluded and why, so the count is never silently missing.

Naming a team: you can identify a team by its name (not case-sensitive — “ba team” matches “BA Team”), its reference (e.g. "DT004"), or its Model Item ID. If your wording doesn’t match any team, the tool tells you the closest team names it found instead of guessing. If it matches more than one team (for example, two teams that happen to share a name), it lists every match rather than picking one — rephrase using the ref or Model Item ID to be specific.

A delivery team’s Members list is what task attribution uses — it’s a different field from Notification Recipients, where leaving it blank means “notify everyone” instead. An empty Members list has no such fallback: a team with no members simply has no tasks it can claim through membership (only tasks it directly owns).

Milestone Reporting

ToolDescription
update_milestone_scopeAdds, updates, or removes milestone scope entries on a model item in a single batch call. Each operation specifies a milestoneId and one of: add (with description), update (with new description), or remove. The entire batch is validated before any changes are saved — if any operation is invalid, nothing is written. Requires Editor role. Your AI agent will describe the changes it is about to make and ask you to confirm before proceeding.
get_milestone_readinessReturns all model items in scope for a milestone, each with their status, baseline status, readiness score, scope description, and open task counts. Designed for project-wide readiness reporting — replaces 150+ sequential tool calls with a single efficient query. Set includeTaskSummary: false for a faster status-only view. Optionally filter by itemTypes to focus on specific item types.

get_milestone_readiness output includes:

  • Milestone header — name, ref, and date
  • Summary — total item count, number baselined, pending review, draft, and total open tasks
  • Per-item data — status, readiness score, scopeDescription (the free-text description of what is in scope at this milestone), milestoneBaseline (the baseline specifically tagged to this milestone), latestBaseline (the most recent baseline regardless of tagging), and open task count
  • Warning — if no items have been added to scope yet, a message is returned explaining how to add them via the Milestone Scope tab in ArchRepo

By default (includeInactive: false), in-scope items whose status is Deleted, Archived, or Rejected are excluded from both the item list and the summary counts. An item is not removed from a milestone’s scope when it is archived or rejected, so counting it would overstate the milestone’s remaining work. Pass includeInactive: true to include them. If every in-scope item is superseded, the warning says so — distinct from the “nothing has been scoped yet” warning, because the remedy differs.

Milestone scope entries can be added and managed via the Milestone Scope tab on a model item in ArchRepo, or programmatically via the update_milestone_scope tool.

Dependency Graph

get_build_dependency_graph answers one question only: “what must be built before what,” where “build” means develop-and-test. It returns a curated subset of relationships and model items — edges are limited to relationship types flagged as construction/build-order dependencies, and only for the item types you ask for via itemTypes. It must not be used to discover integrations, data flows, or any other relationship between model items — for example, relationships like generates, receives, or owns are always excluded, regardless of itemTypes. To explore an item’s full set of connections, use get_all_model_item_relationships or search_model_items instead.

Known limitation. Because data-flow relationships (generates, receives, and similar) are intentionally excluded, an item that only consumes data — with no uses/has Read Access to edge back to its source — can appear as a root (nothing depends on it) even though it is actually downstream at the end of a long data-availability chain. A root in this graph means “nothing else must be constructed first,” not “ready to start end-to-end.” Pass phase: "availability" (see below) for a view that accounts for data-availability order instead.

ToolDescription
get_build_dependency_graphReturns the project’s build-order dependency graph — nodes plus directed edges — in a single call. Designed for reconstructing a dependency tree or build sequence: replaces walking relationships item by item, which can take hundreds of calls on a large project. Optionally filter by itemTypes or bound the graph to a milestone’s in-scope items via milestoneId.

get_build_dependency_graph output includes:

  • nodes — one entry per in-scope item: id, ref, name, type, status. Pass includeReadiness: true to also include readinessScore and buildReadiness.state on each node (omitted by default to keep the response lean).
  • edges — directed connections in the form { from, to, relationshipType }. from depends on to — in other words, to must be developed and tested first. Only relationship types that represent a genuine construction/build-order dependency are included (the same isBuildOrderDependency classification returned by get_metamodel_type_details — e.g. uses, supports, contains, depends on); purely informational or data-flow relationships (e.g. generates, triggers) never appear as edges. Both ends of every edge are guaranteed to be in the returned node set — a dependency pointing at an item excluded by itemTypes or milestoneId is simply left out rather than reported separately.

By default (includeInactive: false), items whose status is Deleted, Archived, or Rejected are excluded from both nodes and edges, consistent with get_all_model_item_relationships; pass includeInactive: true to include them.

This tool returns the raw graph only. It does not compute a critical path, build sequence, or “what unblocks this” analysis — ask your agent to reason over the returned graph, or use a more specialised tool if one is available.

This is the build/develop lens only — what must be developed and tested before what. For the other two lenses ArchRepo’s dependency tooling offers over the same architecture — specification completeness and integration-test / data availability — see Specification Completeness & Dependency Lenses below.

Specification Completeness & Dependency Lenses

ArchRepo’s dependency tooling answers three different questions about the same architecture, depending on which lens you ask for. Pick the lens that matches the question you’re actually asking — don’t assume “build” tells you when something is truly ready.

LensQuestion it answersHow to call it
Build / develop orderWhat must be developed and tested before what?get_build_dependency_graph (default, or phase: "develop" — see note below) — see Dependency Graph above
Specification completenessIs everything this item needs to read from actually written (and Approved) yet — and what is it blocked on?get_specification_completeness, or get_build_dependency_graph with phase: "design"
Integration-test / data availabilityWhat data has to actually exist and flow through the architecture before this can be tested end-to-end?get_build_dependency_graph with phase: "availability"

Passing phase: "develop" explicitly asks for the same build/develop lens, with one refinement: a dependency is only shown between two items that are both real buildable components (applications, services, APIs, data sets, data stores, UI components, reports, streams, and similar) — so a requirement, non-functional concern, task, or open issue never shows up as something else “depends on,” and an Environment hosting the things deployed to it is not shown depending on them. The plain default call (no phase argument) does not apply this refinement and can occasionally include such items.

Specification Completeness

get_specification_completeness and get_build_dependency_graph with phase: "design" are equivalent — same underlying data, same response shape — so use whichever your agent finds first. get_specification_completeness exists as its own named tool specifically so this lens shows up on its own when an AI agent lists what’s available, rather than being hidden behind a parameter on the build-order tool.

This lens looks at data dependencies at the level of individual pieces of data, not whole datasets. Normally, if an item reads from a large shared data set, the build-order view says it depends on the whole data set — even if only one small part of it, written by one specific item, is actually relevant. The specification-completeness view instead says the item depends on whichever item specifically writes the data it reads — often a much shorter, more accurate chain.

On top of data dependencies, this lens also carries the full set of interface and containment dependencies between specs:

  • An item that uses another building block (an application, service, API, data set, data store, stream, data flow, report, or environment) is shown depending on it.
  • An item that implements an Application Pattern, Business Rule, or Use Case is shown depending on it (implementing a Concept does not create a dependency — Concepts are reference material, not something to be “ready”).
  • An item that contains other specs (e.g. an Application containing its UI Components) is shown depending on all of them, and that roll-up carries through nested containment automatically. Containment used purely to describe where something is deployed (an Environment or Infrastructure Environment hosting something) is not treated as a spec dependency, since deployment placement isn’t part of what needs to be designed and approved first.
  • If one item already contains another, a separate “uses” dependency between the same pair is not shown twice — the containment relationship already captures the ordering. A “uses” dependency to anything else is unaffected.

The graph also widens to include Issues and Design Decisions: an item that references an unresolved Issue or an undecided Design Decision is shown as depending on it, since the spec can’t really be considered complete until that’s resolved. Once the Issue is closed (or the Design Decision is Approved), that dependency drops away automatically.

Each item in the response carries an entityIO field showing how confidently its data dependencies are known:

  • mapped — this item’s data reads/writes are fully documented via Data Mapping.
  • declared-none — someone has explicitly confirmed this item genuinely has no data to map.
  • unmapped — this item’s data reads/writes haven’t been documented yet. When the item’s type is expected to have data mapping, it also carries expectation: "expected-but-unmapped" — a genuine gap worth closing; otherwise "not-expected".

The response also includes:

  • coverage — this is specifically data-mapping coverage: project and criticalPath mapped/total counts of items with documented data dependencies. It says nothing about whether interface or containment dependencies are documented, since there’s no equivalent check for those yet. Treat a low ratio as a sign the plan is provisional — but don’t read a high ratio as “the whole plan is fully trustworthy,” since it only speaks to the data side.
  • expectedButUnmapped — the list of items driving that data-mapping coverage gap.
  • blockers — items on the critical path that are waiting on a specific upstream item to be Approved before they can be considered unblocked.

If an item you’re planning to defer (rather than treat as blocked) shows up in a blockedItemId lookup, the result is exactly the same — a deferral is just a block with no planned resolution date, so it affects the downstream plan identically. Use blockedItemId to see the impact of either.

Integration-Test / Data Availability

Pass phase: "availability" to get_build_dependency_graph to trace the actual movement of data through the architecture — including relationships like generates, receives, and provides data for that the build-order view deliberately ignores — and points dependencies the direction data actually has to flow: a consumer depends on its upstream data producer. Pure pass-through items (data flows, streams) are automatically skipped over, so a consumer is shown depending on the real originating source, not an intermediate carrier.

Both the specification-completeness and data-availability responses use the same node/edge shape as the build-order view, plus a source on each edge (why the dependency exists: an interface dependency — uses/implements, a containment dependency, a resolved data dependency, a documented relationship, a pass-through carrier being skipped over, or a blocking Issue/Design Decision).

Effort and Impact

Add includeDuration: true (to either get_specification_completeness or get_build_dependency_graph with any phase) to also see each item’s estimated completion duration and remaining effort — rolled up along its longest dependency chain from the tasks logged against it and everything it depends on. Add blockedItemId (an item’s reference or ID) to also see that item’s blast radius: every downstream item affected if it stays blocked, each marked as either directly held up by it (gated) or only affected after some runway runs out (delayed, with the number of days of runway shown).

Cycle-mediated impact is not real impact. Each item in a blockedImpact result also carries cycleMediated. When it is true, that item is only reachable from the blocked item via a dependency cycle they share — it is mutually reachable with it, not genuinely downstream of it. Its gated/delayed marking is noise from the unresolved cycle, not a confident prediction.

Do not include cycle-mediated items in a headline like “N items slip if this is blocked” — count only the ones with cycleMediated: false, and report the rest separately (for example, “N further items sit on the same dependency cycle; resolve the cycle for a reliable impact figure”).

Cycles

A dependency cycle — A needs B, B needs C, C needs A — has no valid build order. ArchRepo never throws on one or loops forever; it reports it and carries on.

Two independent cycle signals come back, and they can legitimately disagree:

  • criticalPath.hasCycles / criticalPath.cycleIds — computed over the architecture dependency edges only. When hasCycles is true, do not read criticalPath.path as a linear prerequisite sequence.
  • inCycle on each node (with includeDuration: true) — computed over the task-augmented graph, which also includes cross-specification task dependencies the architecture edges never show.

So a project can report hasCycles: false while several nodes are inCycle: true. That is not a contradiction — it means the cycle is task-induced, created by how the work was scheduled rather than by the architecture itself.

An inCycle node also carries cyclePosition:

  • "on" — the node is itself mutually reachable within the cycle. It also carries cycleId, cycleMemberIds (everything on that cycle), and cycleEdges: a shortest closed walk through it, one entry per edge. Each edge is attributed source: "derived" (an architecture dependency) or source: "task" (a cross-specification task dependency, named by taskRef). The "task" edge is usually the one to point at first when explaining a cycle, precisely because the architecture view never shows it. Check whether a cycle’s cycleEdges are all "derived" (an architecture cycle too) or include a "task" edge (task-induced only) before reporting the cause.
  • "downstream" — the node merely depends on a cycle without being on it, and carries downstreamOfCycleId naming that cycle. Describe it as blocked by an upstream cycle, never as in a cycle.

Relationship Graph

Unlike get_build_dependency_graph, get_relationship_graph has no build-order restriction — every relationship type produces an edge. Use this tool to discover integrations, data flows, or any other connection between model items — for example, generates, receives, and owns relationships are all included here, unlike the build graph.

ToolDescription
get_relationship_graphReturns the project’s full active architecture relationship graph — nodes plus directed edges — in a single call. Scope it with itemTypes (recommended for large projects), and optionally bound it to a milestone’s in-scope items via milestoneId.

get_relationship_graph output includes:

  • nodes — one entry per in-scope active item: id, ref, name, type, status. Pass includeReadiness: true to also include readinessScore and buildReadiness.state on each node (omitted by default to keep the response lean).
  • edges — compact [fromIndex, toIndex, relationshipType] tuples. fromIndex and toIndex are positions in the nodes array of this same response (this keeps the payload small on large graphs). from owns the relationship, and to is its target — this describes how the connection is recorded, not a dependency or build order. Unlike get_build_dependency_graph, do not read to as “must be built first”. Both ends of every edge are guaranteed to be in the returned node set — an edge pointing at an item that’s excluded or out of scope is simply left out rather than reported separately.

The edge indices are a positional shorthand internal to that one response — they are not item identifiers. Don’t pass an index to another tool, and don’t reuse an index from an earlier call (a later call may list the nodes in a different order). To act on a node — open it, link to it, or look it up with another tool — read that node out of the nodes array and use its Model Item ID (id) or reference (ref).

Scoping the graph:

  • itemTypes — an allow-list of item types to include (e.g. ["system", "api", "stream"]). This is the recommended way to keep the response small, and is often all you need. Supplying itemTypes turns off the default exclusion list below (an explicit allow-list is the scope), unless you also pass excludeTypes yourself.
  • When itemTypes is omitted, nodes are restricted to the active structural architecture. Items whose status is Deleted, Archived, or Rejected are excluded by default (pass includeInactive: true to include them), and a fixed set of item types that sit outside the structural architecture are excluded by default, since they represent delivery tracking, governance, or reference material:
    • Delivery — tasks, delivery increments, delivery groupings, milestones, releases, delivery organisations
    • Governance / rationale — risks, issues, assumptions, design decisions
    • Reference / support — media, FAQs, glossary terms, requests, artefacts, business references
  • excludeTypes — override or extend that default exclusion set. Any item type not listed is included automatically, so new item types show up without this tool needing an update.

Very large projects: if the in-scope graph has more nodes than maxNodes (default 1000), the tool returns a short summary — { tooLarge: true, nodeCount, edgeCount, maxNodes, nodeCountsByType }instead of the graph, rather than returning a partial one. Use the per-type counts in nodeCountsByType to re-run scoped to the types you actually need via itemTypes (and/or a milestoneId), or raise maxNodes to fetch the whole thing.

Seed-scoped neighbourhood — “show me what’s around this item”: pass seedItemIds (one or more item references or IDs) to get back only those items plus everything within hops connections of them, instead of the whole in-scope graph. hops defaults to 1 and can be raised up to 5. By default the neighbourhood is traced in both directions (seedDirection: 'both'); pass 'out' or 'in' to follow only relationships the seed owns, or only relationships pointing at the seed. A seed item is always included in the response even if its type would normally be excluded. The response also includes a seeds list confirming which items were resolved. Because the item-count limit above is checked after narrowing to the neighbourhood, seeding is a good way to fetch a useful slice of a project that would otherwise be too large.

This tool returns the raw graph only. It does not compute a critical path, build sequence, or impact analysis — use get_build_dependency_graph or get_item_impact for those questions.

Impact Analysis

ToolDescription
get_item_impactReturns the transitive dependency closure of a model item in both directions, computed in a single call over the same graph as get_build_dependency_graph — no manual graph walking.

get_item_impact output includes:

  • item — the queried item’s id, ref, name, type, and status.
  • precedes — everything the item transitively depends on: its prerequisites, what must be developed and tested first.
  • unblocks — everything that transitively depends on the item: its downstream impact, what gets blocked if this item slips.

Each node in precedes and unblocks carries a depth (1 = direct, 2+ = transitive hops) plus the same core fields as get_build_dependency_graph nodes. Pass includeReadiness: true to also include readinessScore and buildReadiness.state (omitted by default). Traversal is cycle-safe — a cyclic graph returns each reachable node once — and follows only the same construction/build-order dependency edges as get_build_dependency_graph (see the data-flow-exclusion limitation noted above). Traversal is unbounded by default; pass maxDepth to cap the number of hops walked in each direction on very large graphs.

By default (includeInactive: false), items whose status is Deleted, Archived, or Rejected are excluded from the traversal, consistent with get_build_dependency_graph. An inactive item leaves the node set entirely, so a chain that reaches a node only through one terminates there rather than routing around it. Pass includeInactive: true to traverse them.

Graph Hubs

ToolDescription
get_graph_hubsRanks in-scope items by structural weight — replaces calling get_item_impact once per item to find the load-bearing ones.

get_graph_hubs output includes:

  • metricScopes — names the edge set behind each metric, since the two are computed differently and are not interchangeable.
  • totalNodesConsidered — the full in-scope item count, before topN truncation.
  • hubs — the ranked list. Each entry carries the item’s id/ref/name/type/status, its inDegree/outDegree/totalDegree, its blastRadius, and its 1-based rank under the requested ordering.

Two distinct metrics are reported, never combined into one score:

  • degree (inDegree/outDegree/totalDegree) — relationship-graph connectivity: how many stored relationships, of any type and in either direction, touch the item. Duplicated relationship rows are deduplicated before counting.
  • blastRadius — build-order downstream reach: the same transitive count get_item_impact’s unblocks would report for that item, computed over the construction/build-order dependency edges only.

Pass rankBy ('degree', 'blastRadius', or 'both', default 'both') to choose the ordering. 'both' orders by total degree first, blast radius second, and item reference third — two sort keys, not a summed score, so the two metrics stay legible rather than blended into a meaningless composite. topN bounds the returned list (default 20, maximum 100).

itemTypes, excludeTypes, milestoneId, and includeInactive scope the computation the same way they do for get_relationship_graph — both metrics are computed within that scope, so a relationship to an item outside it never counts toward either.

Connection Path

ToolDescription
get_connection_pathReturns the shortest path(s) connecting two specific model items over the relationship graph — answers “how does A relate to B” directly, instead of fetching two impact closures and intersecting them by hand.

get_connection_path output includes:

  • from / to — the resolved id, ref, name, type, and status of the two queried items.
  • found — whether a connecting path exists within maxHops.
  • paths — an ordered array of hops for each returned path. Each hop carries the source node (id/ref/name/type/status), the relationshipType it travels through, and traversedAgainstStorageDirectionfalse when the hop follows the relationship’s own recorded direction, true when it was walked backwards — so a caller can render the connection correctly (e.g. “API024 supports UC-11” rather than implying the reverse). The final hop’s destination is the top-level to item.
  • truncatedtrue if more equal-length shortest paths existed than maxPaths allowed returning.

If found is false, reason explains why: disconnected (no path exists between the two items at all) or maxHopsExceeded (a path may exist, but only beyond maxHops, and re-running with a higher maxHops might find it). This is a normal answer, not an error.

Only the shortest path length is ever returned — a longer alternate is never substituted for a shorter one. When several paths tie for shortest, up to maxPaths (default 3, maximum 10) of them are returned. maxHops bounds how far the search looks before giving up (default 6, maximum 10). direction ('out', 'in', or 'both', default 'both') controls whether the path must follow relationships in their recorded direction, against it, or either — 'both' is usually what you want, since relationship direction reflects who recorded the connection, not which way it “matters”.

itemTypes, excludeTypes, and includeInactive scope the traversal the same way they do for get_relationship_graph; the two queried items are always considered regardless of these filters.

This tool returns the raw connecting chain only — it does not narrate or explain the path in prose, and it does not compute a “best” path by readiness or effort, only the shortest one by number of hops.

Data Lineage

ToolDescription
get_data_lineageResolves table-level data provenance for a model item — who actually writes the specific entity it reads, recursively back to the originating source — rather than stopping at the dataset.

Never answer a lineage question by walking relationships one hop. A relationship shows only that an item has read or write access to a whole dataset. It does not resolve which entity within that dataset, nor who writes that entity. “REP032 reads DSet026” is not a lineage answer. Use get_data_lineage for any question about provenance, “where does this data come from”, “what feeds this”, or “trace this data”.

get_data_lineage output includes:

  • threads — the rationalised chains, one per entity and direction, ordered with the focal item first. Each hop carries the item (itemId/ref/name/type/status), its role (focal, source, transform, or consumer), the entity it connects through, the action (reads/writes/modifies), and provenance.
  • rawThreads — the same chains with pass-through carriers spliced back in. Expand these only if asked for the literal transport path.
  • rationalisation — what was simplified to produce threads (see below).
  • cycleItemIds — items caught in a lineage cycle, surfaced rather than thrown.

Pass entity to trace a single entity thread — the best way to answer a specific “where does field X come from” question. Omit it to trace every entity the focal item touches. Pass direction to restrict to upstream (sources) or downstream (consumers).

Resolution is entity-level, not dataset-level: writers or readers of a different entity in the same dataset never appear in a thread. And the trace is derived on read from existing data mapping and relationships — not a stored inverse index — so it can never go stale relative to the model.

Report the rationalisation honestly. The chain in threads is a simplified view, and the simplifications are disclosed rather than hidden:

  • impreciseHops — a dataset-level read/write relationship with no covering data-mapping row. This is a genuine gap in the model, flagged rather than silently dropped. Report it as a gap; don’t present the chain as fully resolved.
  • contractedCarriers — pure pass-through conduits (data flows, streams) collapsed out, so a consumer resolves to its real upstream instead of the carrier it happens to read through.
  • dedupedOrigins — parallel alternates modelling the same real hop, collapsed to one canonical hop. The alternates are listed in alternateItemIds; they are not missing.

Where cycleItemIds is non-empty, the chain through those items is not a linear provenance sequence — say so rather than picking an arbitrary order.

When reporting a chain, use the entity and item display names, never raw metamodel type names.

Relationships

ToolDescription
get_all_model_item_relationshipsReturns all relationships for a model item — both outbound (what this item points to) and inbound (other items that point to this item). The response includes a resolved field naming the queried item (id, ref, name, type), so results from several parallel calls can be matched back to their requests. Each relationship entry is direction-labelled and includes the connected item’s id, ref, name, type, status, relationship type, and description. Optionally filter by ofMetamodelType or withRelationshipType. By default (includeInactive: false), endpoints whose status is Deleted, Archived, or Rejected are excluded from both directions so dead items don’t get pulled into a dependency graph as if they were live; pass includeInactive: true to get every connected endpoint regardless of status. Use this whenever you need to understand or copy an item’s connections.
get_valid_relationshipsReturns relationship context from the metamodel. With one type: returns full inbound (what points TO this type) and outbound (what this type points TO) maps. With two types: returns candidates in both directions showing which item will own the relationship. Relationship entries may include an optional helpGuidance field with context from the metamodel author on when and how to use that relationship type.
relate_model_itemsCreates a relationship between two model items. The metamodel determines ownership and type automatically. Accepts an optional description to record why the items are related. Returns options when multiple relationship types are valid between the pair.
unrelate_model_itemsRemoves all relationships between two model items, scanning both directions regardless of which item owns the storage.
update_relationship_descriptionSets or updates the description on an existing relationship between two items. Use to add rationale to relationships that were created without one, or to refine existing descriptions.
copy_model_item_relationshipsCopies all relationships (or a filtered subset) from a source model item to a target model item of the same metamodel type. Handles both outbound (creates them on the target) and inbound (adds the target as an additional related item on each inbound item). Optionally pass ofMetamodelTypes to copy only specific categories. Returns a summary of what was copied and what was skipped.

Baselines

ToolDescription
list_model_item_baselinesReturns all specification baselines for a model item, sorted newest first. Each entry includes the baseline ID, name, description, created-by, date, item count, and — for baselines tagged to a milestone — the milestoneId and milestoneName.
get_model_item_baselineReturns the full frozen snapshot for a specific baseline: the complete rendered Markdown spec (captured at baseline time) and a drift analysis comparing current versions against baseline versions for all dependencies.
create_model_item_baselineCreates a new specification baseline snapshot for a model item, capturing its specification and all dependency versions at that point in time. Requires Editor role.
compare_model_item_with_latest_baselineCompares the current state of a model item against its most recent baseline. Returns a drift report showing what has changed since the snapshot was taken. Returns noBaseline: true if no baselines exist yet.

Media

ToolDescription
get_item_imagesReturns embedded diagram data for a model item — draw.io SVGs, raster images, and PlantUML source. The first result names the queried item (id, ref, name, type) so results from several parallel calls can be matched back to their requests. Call this when the narrative or spec contains image references (lines starting ![) to retrieve diagram content for visual interpretation.

At session start: call fetch_my_tasks to understand the user’s current workload before diving into analysis. Use optional filters — for example progress: ["Backlog"] for weekly planning, or piId to focus on tasks in a specific sprint.

Before updating a task: call fetch_task_details to read the current state of the task, including its PI, team, dependencies, and linked items. Your agent uses this to show you a clear Before / After summary before making any changes.

To update your Focus Now list or task order: call add_focus_now to pin a task to your personal shortlist, or set_task_order to reorder a section. Both tools are scoped to your identity — changes are personal and not visible to other project members.

To update task progress or status independently: use update_task_progress to record a completion percentage (with an optional note) or update_task_status to change the task’s status — including marking it as Blocked. These are focused alternatives to update_task when you only need to update a single field.

Creating or updating tasks: create_task and update_task require Editor role on the project. Your agent will always describe what it is about to do and ask you to confirm before writing any changes.

To understand a concern area at a glance: call get_concern_overview with a concern name (e.g. "Business" or "Apps & Systems"). This returns the concern narrative, each topic’s narrative, and the first batch of items per topic — giving you a structured entry point before drilling into individual items.

When you don’t know the item ID: call search_model_items first to locate the item by keyword, then use the returned id with the tools below.

For a thorough analysis of any architecture item, call the tools in this order:

  1. get_model_item — get core metadata and the readiness score, which summarises completeness across all relationship categories
  2. get_all_model_item_properties — get all stored properties: external references, approval state, and all type-specific fields
  3. get_all_model_item_relationships — get the full picture of connections: both outbound (what this item points to) and inbound (what points to this item)
  4. get_model_item_narrative — read the full architectural description, design decisions, and diagrams. If the narrative contains image references (lines starting ![), call get_item_images with the same item to retrieve diagram data for visual interpretation.
  5. get_data_set_schema — for any related Data Set items, fetch the full entity model and field definitions

For a comprehensive single-call view: use get_model_item_spec to retrieve the complete specification as Markdown in one call — equivalent to the full 5-step sequence above, with all properties, narrative, relationships, and (for DataSets) the full data model. If the result contains image references (lines starting ![), call get_item_images to retrieve diagram data.

To generate a milestone readiness report:

Call get_milestone_readiness with the milestone’s model item ID. This returns all in-scope items in a single call, with their status, baseline status, readiness score, scope description, and open task counts. Use list_my_projectslist_model_items (with type: "milestone") to find the milestone ID if you don’t have it.

To add or update milestone scope entries:

Call update_milestone_scope with the model item ID and a list of operations. Each operation targets a milestone by ID and specifies whether to add (with a description), update (to replace the description), or remove the entry. Use list_model_items with type: "milestone" to find milestone IDs.

To copy relationships from one item to another:

Call copy_model_item_relationships with the source and target item IDs. Both items must be the same metamodel type. Pass ofMetamodelTypes to restrict the copy to specific relationship categories (e.g. ["businessOutcome", "useCase", "businessRequirement"]).

Linking items by ref (recommended):

When asking your agent to link items, refer to them by their human-readable ref — e.g. “link UI-062 to FR-021, FR-010, NFR-101, and NFR-017”. The agent can pass those refs straight to relate_model_items without having to look up Model Item IDs first. Every response from a write tool echoes the resolved itemA / itemB (or source / target) so you can confirm at a glance that the links landed on the right items.

All access is scoped to a single project. Your agent cannot read data from projects you are not a member of.

Prompts

In addition to tools, the ArchRepo MCP server provides prompts — pre-built workflow templates that MCP clients can surface as slash commands or quick-start options. Each prompt encodes domain knowledge and the correct tool-calling sequence for a common architectural analysis task.

PromptArgumentsDescription
analyse-architecture-itemorgId, projectId, itemIdentifierFull 5-step analysis of a specific item: metadata, complete properties, narrative, related items, and data models. Produces a structured report with completeness gaps and recommendations.
project-health-checkorgId, projectIdSurvey the entire project for completeness gaps, low-readiness items, open risks, and unresolved assumptions. Produces a RAG-status health report with prioritised recommendations.
impact-assessmentorgId, projectId, itemIdentifier, proposedChangeTrace the ripple effects of a proposed change through related items, data contracts, and risks. Leads with get_item_impact for the full transitive dependency closure in one call, rather than walking relationships hop by hop. Suggests using relate_model_items as a follow-up write for any missing connections identified — not as the way to analyse dependencies.
specification-readiness-revieworgId, projectId, itemIdentifierReview whether an item is ready to hand to a development team. Produces a RAG-status checklist of blockers and recommendations, including any specification-completeness blocker (an unapproved upstream writer, an open Issue, or an undecided Design Decision) and its completion duration. Suggests using relate_model_items to fix missing relationship blockers.
specification-completeness-planorgId, projectId, optional milestoneIdProduce a project-level (or milestone-scoped) specification-completion plan — sequence, effort remaining, and blockers — using the specification-completeness dependency lens. Reports the plan’s trustworthiness via data-mapping coverage rather than presenting an optimistic timeline.
data-lineage-traceorgId, projectId, startingPointTrace data from source through streams, APIs, and services to consuming systems. Leads with the data-availability lens (phase: "availability") to reconstruct the full lineage chain in one call, rather than walking relationships hop by hop. Identifies transformations and lineage gaps.
generate-client-documentorgId, projectId, itemIdentifier, optional documentStyle (technical | executive | review), optional includeRelatedGenerate a structured, client-ready Markdown document for a model item. Produces a Word-paste-ready draft with sections covering purpose, design decisions, APIs & streams, data, non-functional requirements, risks & assumptions, and acceptance criteria. documentStyle controls depth and tone; includeRelated fetches connected items to enrich the document.

In Claude Desktop, prompts appear when you click the + button in the chat input. In other MCP clients they may appear as slash commands.

Narratives & Diagrams

The get_model_item_narrative tool returns the narrative as Markdown, converted from ArchRepo’s rich block editor format. It includes:

  • Headings, paragraphs, lists, and tables exactly as authored
  • Draw.io diagrams as image URLs pointing to ArchRepo’s versioned media endpoint (https://archrepo.com/dashboard/org/{orgId}/prj/{prjId}/mediaDisplay/{mediaId}/{version}). These URLs require authentication. AI agents connected to an authenticated MCP session — such as Claude Desktop — can render these diagrams directly.
  • PlantUML diagrams as plantuml code blocks. Claude and other AI tools can read PlantUML syntax and understand the diagram’s structure.
  • References to embedded model items, shown as hyperlinks to the item’s page in ArchRepo.
  • Data entity tables, shown inline with attribute definitions and optional Mermaid ERDs.

The get_model_item_spec tool returns diagrams using the same versioned media URLs.

If a model item has no narrative, the tool returns (No narrative content).

Enabling MCP for a Project (Admins)

To allow AI agents to connect to a project:

  1. Go to Project Settings for the project
  2. Toggle MCP Enabled to on
  3. Save the settings

Only project members can connect. Non-members receive an error even if MCP is enabled.

Last updated on