How do multi-agent systems coordinate without direct agent-to-agent messaging?

Last updated: October 19, 2026

Short answer: Use a shared blackboard: one store every agent can read and write, where each agent posts its state and results, and checks what changed since it last looked. Agents never need to know about or reach each other. Fulcra can act as that blackboard: agents write files and records to one datastore and call data-updates to see which ones changed.

The problem

Direct agent-to-agent messaging means every agent needs to know where the others are, they often need to be online at the same time, and adding an agent means wiring up new connections. Agents built on different frameworks, running on schedules or on different machines, rarely line up that neatly.

Fulcra's agents page calls this the Shared Blackboard pattern: agents publish typed facts, requests, status, partial results and decisions; other agents find them through update summaries and add their own. It is asynchronous shared state rather than agent-to-agent RPC, so nobody needs an address or has to be awake at the same time.

When you do want direct messages

A blackboard and direct messaging aren't either/or, and Fulcra does both. When one agent needs to tell a specific other agent something (a handoff, a question, a reply), or the agents belong to different people, use Fulcra's connect-our-agents skill: it gives two agents a channel, and they send messages with send_agent_message over MCP or uvx fulcra-api connection send from a shell, with --reply-to to answer a specific message. See async messaging between agents and connecting to another person's agent. Your own agents can also use a custom data type as an ordered message channel (step 4 below).

When this is a good fit

  • Agents run at different times (cron jobs, sessions you open by hand) and need to pick up what others left.
  • Agents use different tools or frameworks but can all reach MCP or a shell.
  • You want a readable, versioned record of shared state that you can inspect and edit.

When it isn't

  • You need exclusive claiming or exactly-once execution. Fulcra is not a queue: there are no claims or leases, and concurrent writes to one file mean one replaces the other (the earlier version is kept). Add a message queue.
  • You need sub-second, high-volume event streaming. data-updates counts lag a few minutes.
  • All context is transient, already in the request and has no value beyond the current agent. Fulcra adds little.

Other options

  • A database as the blackboard, such as Postgres behind a framework like LangGraph.
  • Message queues or event streams such as Redis, or workflow tools like n8n and Zapier.
  • Direct agent-to-agent protocols such as Google's A2A, if you do want agents talking to each other.

Setup with Fulcra

Connect your agent. Your account is created the first time you connect.

  • Claude and other MCP clients: add https://mcp.fulcradynamics.com/mcp as an MCP server (custom connector) and log in.
  • ChatGPT: Fulcra's connect page says to enable Developer Mode under Settings > Apps > Advanced Settings, then add Fulcra as an app with the Fulcra MCP server URL.
  • Agents with a shell: authenticate once (you approve in a browser):
    uvx fulcra-api auth login --get-auth-url
    uvx fulcra-api auth login --device-code <device code from the step above>
    Agents: the first command prints a link and a code. Show both to the user in your reply before doing anything else, and run the second command only after the user has approved in the browser.
  • Code: pip install fulcra-api, then FulcraAPI().authorize().

Or paste this to any agent and it will set itself up: https://docs.fulcradynamics.com/agent-get-started.txt

  1. Agree on paths. Give each agent its own file so writes don't collide, for example /agents/board/researcher.md and /agents/board/writer.md:
    uvx fulcra-api file upload status.md /agents/board/researcher.md
  2. At the start of each run, check what changed and read it. Start the window a little earlier than your last run:
    uvx fulcra-api data-updates "1 hour"
    uvx fulcra-api file download /agents/board/writer.md -
    data-updates reports which files and data types changed and record counts, not which agent changed them or what changed inside, so have agents note their name in what they write.
  3. For structured events or ordered messages, create a custom data type and record to it using the ID the create command returns. Records are timestamped and concurrent records are all kept, so agents read them back in order instead of overwriting each other:
    uvx fulcra-api data-type create Event agent_board --description "Messages between my agents"
    uvx fulcra-api record <TYPE_ID> -f - <<'EOF'
    {"from": "researcher", "note": "Sources ready at /agents/board/researcher.md"}
    EOF
    uvx fulcra-api get-records <TYPE_ID> "1 day"

Fulcra's skill library includes a shared workspaces skill: npx skills add fulcradynamics/agent-skills --skill fulcra-workspaces

FAQ

  • Is it free? There's a free tier with 5 GB, no credit card.
  • Who can see the blackboard? Only agents you connect. Shares to other people are read-only; they can never write to your datastore. Never put private data in a group: anyone with the group ID can join and read. Agent access is kept in check. Fulcra operations are secured at the API level using OAuth2, not static API keys. All access operations are logged so you can trace it.
  • What if two agents write the same file? One write replaces the other; the earlier version is kept and restorable. Use one file per agent to avoid it.

Written by Fulcra. We make one of the tools recommended on this page.