Back to list

Runbear MCP vs Viktor MCP (2026)

Viktor MCP runs an agent that already exists. Runbear MCP is where you assemble one — push the skills you wrote in Claude Code into an agent, wire the trigger, ship it to Slack.

Both are MCP servers you add to Claude Code, and they are built for different jobs. Viktor MCP calls an agent that already exists and brings the answer back. Runbear MCP is where you assemble the agent itself.

Name check: viktor.com, the AI employee in Slack and Teams, is a different product from VIKTOR.AI (viktor.ai), an engineering platform with its own MCP beta. The tools here are viktor.com's.

Viktor MCP — what it's built for

Running an agent from outside your code, and collecting the result.

ToolWhat it does
ask_viktorOpen a thread, run it, wait for the result
create_thread · send_messageStart a thread and keep sending messages
wait_for_run · get_run · get_run_resultCheck run state, receive output
cancel_runCancel a run in progress
list_threads · get_thread · list_messages · list_runsBrowse threads, messages, runs
get_file_download_urlGet a download URL for an output file
whoamiCheck key scope and rate limit

In short: an API for invoking an agent from another system and collecting the answer.

Runbear MCP — what it's built for

Assembling the agent: what it knows, what it can reach, when it runs, where it lives.

AreaWhat you get
Bring your own skillsupload_local_skill_to_agent — push a skill you already wrote in Claude Code into the agent
Connect appssearch_apps, attach_app, detach_tool, Pipedream connections
Shape behaviorget_agent, update_agent, context blocks
Triggers and schedulesExternal event triggers, cron schedules
Search its knowledgerunbear_file_search across the knowledge base
Ask the userrunbear_ask_user_choice for button prompts
Ship to Slackdeploy_to_slack, join_slack_channels, file upload
Watch it runlist_recent_agent_traces, get_agent_trace

In short: a management API for assembling, wiring, deploying, and watching an agent.

Viktor — run an agent and get the result. Runbear — build and configure the agent. Different halves of the same lifecycle, which is why they don't conflict.

Install both pieces

The MCP server manages agents. The plugin adds the commands that push your local skills into one.

claude mcp add --transport http runbear https://api.runbear.io/mcp
/plugin marketplace add runbear-io/skills
/plugin install skill-uploader@runbear-skills

No key to paste — the first request opens a Runbear sign-in.

You decide what to build while you build it

This is the part a settings form is bad at. A form needs you to already know what you are making. What follows is one session in three frames — each frame is the same terminal a little further along, so the earlier lines stay on screen. The spec gets decided in the conversation, the skills you already wrote get attached one at a time, and the schedule and the Slack deploy are just more sentences.

Claude Code terminal. The user asks to route billing questions to whoever owns the account and says they have not worked out how to detect billing yet. Claude asks back whether to use keywords, amount thresholds, or a skill the user already has. The user answers that a cs-org-lookup skill already exists and to use that. A /skill-uploader:upload command runs against the Support Triage agent and returns a green confirmation: Skill uploaded, cs-org-lookup.

Step 1 — the spec gets settled mid-session. The request lands incomplete on purpose: no rule yet for what counts as billing. A form would have to reject that. One question back, and the answer turns out to be a skill that already exists on disk.

The same terminal, further along. The user adds a second skill, langfuse-log-lookup, with one sentence. A second /skill-uploader:upload command runs against the Support Triage agent and returns its own green confirmation: Skill uploaded, langfuse-log-lookup. Both uploads are now listed, each reported on its own line.

Step 2, same session — the second skill goes up. Only the last two lines are new; the frame above is still there because nothing was restarted. Each skill is its own upload call with its own result, so one getting blocked would not take the other down.

The finished session. The user asks for a sweep every weekday at 9am; runbear MCP create_scheduled_job runs and confirms: Scheduled, weekdays 9:00 AM. The user then says to ship it to #support; runbear MCP deploy_to_slack and join_slack_channels run and confirm: Deployed, live in #support. A closing line reads: none of this was planned before the session started.

Step 3, same session — the trigger and the deploy are sentences too. The weekday schedule and the #support channel were named here, not before the session opened. Read top to bottom, this one frame is the whole session.

Two skills that were sitting in a local folder are now part of an agent that runs every weekday and answers in Slack. Each upload is one call to upload_local_skill_to_agent; point it at a folder with several skills and it uploads them one at a time, reporting each result separately. The uploader is instructed to skip .env, secrets, and client config, and the server re-validates and can block an upload outright — a blocked skill comes back with a reason like secret_detected.

What actually transfers

Worth knowing before you point it at a folder you care about.

What happens
The skill fileSKILL.md lands under .claude/skills/ and loads on the agent's next activation
Several skills at onceOne upload call each, reported per skill — a blocked one does not stop the others
SecretsThe uploader skips .env, .mcp.json, and client config; the server re-validates and can block with a reason
Anything a credential touchesSet it up in the dashboard vault, not the chat — that part is deliberately not conversational
A bigger folderBeyond skills, /runbear:workspace-upload ships a whole directory into the agent's writable workspace

And what stays in the dashboard, per Runbear's own limitations: model settings like temperature and reasoning effort, knowledge base sync setup, and scheduled jobs currently target Slack channels and DMs.

You never type a tool name

The same is true of the agent's own wiring. One sentence in, and the whole chain gets built without the user naming a single tool:

Claude Code terminal. The user types one sentence: when a Zoom meeting ends, pull the action items from Granola and post them to #standup. Five runbear MCP tool calls follow, each with its own green confirmation — create_agent creates Meeting Actions, create_context sets owner and due date per item, attach_app with connect_app_to_agent connects Granola after one browser approval, create_external_trigger wires zoom.meeting_ended, and deploy_to_slack with join_slack_channels deploys it to answer in #standup. A closing note reads: you named none of these tools, and Viktor MCP enters here, not above, because its 13 tools send work to an agent that already exists.

You wrote the first line. Every tool call under it is Claude Code picking Runbear's tools on its own — your client still asks before each write, and Granola sends you to a browser once to authorize. Integrations that need a stored secret are set up in the Runbear dashboard, not in the chat. Vendor docs, observed 2026-08-06.

And the result, five minutes after the meeting ended:

Slack channel #standup with 14 members. The Meeting Actions app posts at 2:47 PM that the Pricing sync wrapped five minutes ago, with three action items: Dana to send revised tiers to legal by Thursday, Sam to pull churn numbers for enterprise by Friday, and Ravi to book the follow-up with Acme. Three stat tiles read Meeting 38m, Action items 3, Posted after 5m. Below them a checklist confirms Zoom (meeting ended, trigger fired), Granola (read notes for Pricing sync), and Slack (posted to #standup). At 2:51 PM Dana replies that she had already forgotten the legal one.

The agent you wrote in one sentence, five minutes after the call ends. Illustrative example.

Which one to install

Already running Viktor and you just need its answer inside a call — Viktor MCP. It opens the thread, waits, and hands the result back with no webhook and no trace lookup afterward.

Skills piling up in Claude Code that only you can run — Runbear MCP. That is the gap it closes.

Both — install both. They don't conflict, and they don't reach the same agent: Runbear MCP manages agents in your Runbear org, Viktor MCP delegates to Viktor.

Try it on something you already wrote

# once, if you have not already
claude mcp add --transport http runbear https://api.runbear.io/mcp
/plugin marketplace add runbear-io/skills
/plugin install skill-uploader@runbear-skills

# then, on a skill you already wrote
/skill-uploader:upload ./your-skill --agent https://app.runbear.io/agents/<appId>

A Runbear account is free to start and needs no card. If you would rather begin from nothing, say this instead:

Create a Runbear agent called Support Triage that answers in a friendly, direct voice and escalates billing questions to #finance. Then show me what you made.

We build Runbear, so treat the framing accordingly. Viktor's table is its complete published tool set, condensed only in layout. Runbear's row for skill upload, knowledge search, and user prompts covers tools live in the MCP server that its public reference has not caught up with yet; everything else is in the published catalog. Observed 2026-08-06.

Sources, observed 2026-08-06: Runbear MCP · Runbear pre-built MCP servers · Pipedream Zoom trigger components · Viktor MCP · VIKTOR.AI, for disambiguation