Ruflo
Agent swarms with shared vector memory and task routing for Claude Code and other MCP clients
Exposes the PraisonAI agent framework's agents, memory, knowledge and model tools over MCP
Official · Mervin Praison Python Local · stdio AI and MLKnowledge and memory
79 popularity score ★ 9.3k ↓ 3.1k/mo
Opens the app, which asks before it adds the server. Then replace each <NAME> in its settings with your value.
It needs OPENAI_API_KEY. Replace each <NAME> with your value.
pip install "praisonai-mcp[all]"claude mcp add praisonai -e OPENAI_API_KEY=<OPENAI_API_KEY> -- praisonai-mcp serve --transport stdio{
"mcpServers": {
"praisonai": {
"command": "praisonai-mcp",
"args": [
"serve",
"--transport",
"stdio"
],
"env": {
"OPENAI_API_KEY": "<OPENAI_API_KEY>"
}
}
}
}{
"mcpServers": {
"praisonai": {
"command": "praisonai-mcp",
"args": [
"serve",
"--transport",
"stdio"
],
"env": {
"OPENAI_API_KEY": "<OPENAI_API_KEY>"
}
}
}
}{
"servers": {
"praisonai": {
"type": "stdio",
"command": "praisonai-mcp",
"args": [
"serve",
"--transport",
"stdio"
],
"env": {
"OPENAI_API_KEY": "<OPENAI_API_KEY>"
}
}
}
}[mcp_servers.praisonai]
command = "praisonai-mcp"
args = ["serve", "--transport", "stdio"]
[mcp_servers.praisonai.env]
OPENAI_API_KEY = "<OPENAI_API_KEY>"gemini mcp add --scope user -e OPENAI_API_KEY=<OPENAI_API_KEY> praisonai praisonai-mcp -- serve --transport stdioOPENAI_API_KEY secret |
Required: Key for the default OpenAI models used by the model-backed tools. `doctor` warns "No API keys configured" without any provider key. |
|---|---|
ANTHROPIC_API_KEY secret |
Optional: Optional Anthropic key, for Claude models named in a tool's model argument. |
GOOGLE_API_KEY secret |
Optional: Optional Google key, for Gemini models named in a tool's model argument. |
PraisonAI MCP is the server package of the PraisonAI agent framework. You start it with `praisonai-mcp serve`, and it hands the framework's features to a client such as Claude Desktop or Cursor as MCP tools. From there the client can pass a task to a PraisonAI agent, run a workflow or a research job, make images, video or speech, transcribe audio, and keep memory and a knowledge base. It also manages rule files, todos and scheduled tasks, and can work with a provider's files, batches, vector stores and fine-tuning jobs. Alongside the tools come seven read-only resources and seven prompt templates.
Transport is stdio unless you pass `--transport http-stream`. In that mode it binds to 127.0.0.1 on port 8080 at `/mcp`, and `--host`, `--port` and `--endpoint` change that. With the full `praisonai` package installed the same commands also run as `praisonai mcp ...`.
The code registers 85 tools, all named `praisonai.<area>.<action>`, where the docs count 86. Most of them need more than this package. The model tools (chat completion, images, audio, embeddings, moderation, rerank, RAG, web search, guardrails), workflow runs and everything in the extended set (video, provider files, batches, vector stores, assistants, fine-tuning, OCR, containers, deploy) import their code from the separate `praisonai` package. Without it they come back with an error asking you to run `pip install praisonai` (capabilities.py, extended_capabilities.py, _wrapper_bridge.py). The agent, research, memory, knowledge, rules, todo and schedule tools run on this package alone.
The project README now talks up running offline on a local model. For this server, models are fixed per tool in code, and the defaults are OpenAI ones (gpt-4o-mini, dall-e-3, whisper-1 and so on). `agent.chat`, `agent.run` and `chat.completion` accept a `model` argument, so a client can name something like `ollama/llama3.2` there. `research.run` always calls gpt-4o, and no setting changes the default model server-wide.
| Runtime | Python 3.10+ |
|---|---|
| Runs on | macOS, Windows, Linux |
| OpenAI | Paid planDefault provider for the model-backed tools. Anthropic or Google keys are optional, and agent and chat tools can take a local model name instead |
| Also |
|
Install with `pip install "praisonai-mcp[all]"`, or `pip install "praisonai[mcp]"` for the whole framework. Add `pip install praisonai` if you installed the standalone package and want the model, workflow and extended tools. Set OPENAI_API_KEY for the default models. To use a local model with the agent and chat tools, have Ollama running and pass its model name in the tool's `model` argument. Provider calls are billed by the provider.
Without the `praisonai` package co-installed, the extended tools (video, files, batches, vector stores, assistants, fine-tuning, OCR, containers, workflow.auto, deploy) return an error instead of working. Its docs note that knowledge, session, hooks, eval, workflow, audio, guardrails, OCR, a2a, containers, skills and realtime tools returned "not available" errors in releases before PR #4311; older installs should be upgraded. `knowledge.clear` reports an error when the configured backend (for example Chroma) cannot reset. The docs' tool list uses `ocr.extract`, but the registered tool is `praisonai.ocr`.
Suits developers already building with PraisonAI who want to drive its agents, workflows and memory from Claude Desktop, Cursor or another MCP client. In practice that means an OpenAI key and the full `praisonai` package, since most tools default to OpenAI models and import from it. Running fully on a local model only goes as far as the few tools that take a `model` argument. It puts 85 tools in front of the client at once, so someone who wants a single capability (only web search, only memory) will find a narrower server easier to reason about. Those who only need to serve a few custom Python tools can use PraisonAI's lighter `praisonai serve mcp` server, as the package page describes.
31 only read, 20 change things, 9 can delete or overwrite. A ? marks an optional parameter.
praisonai.agent.chatmessage: stringmodel?: stringpraisonai.agent.runtask: stringmodel?: stringpraisonai.research.runtopic: stringdepth?: stringpraisonai.workflow.run changesyaml_content: stringpraisonai.workflow.run_file changesfile_path: stringpraisonai.workflow.auto changestopic: stringpattern?: stringpraisonai.workflow.listpraisonai.workflow.validatefile_path: stringpraisonai.workflow.showfile_path: stringpraisonai.chat.completionmessage: stringmodel?: stringsystem_prompt?: stringpraisonai.images.generate changesprompt: stringmodel?: stringsize?: stringn?: integerpraisonai.videos.generate changesprompt: stringmodel?: stringduration?: integerpraisonai.audio.transcribefile_path: stringmodel?: stringlanguage?: stringpraisonai.audio.speech changestext: stringmodel?: stringvoice?: stringpraisonai.embed.createtext: stringmodel?: stringpraisonai.moderate.checktext: stringpraisonai.rerankquery: stringdocuments: arraymodel?: stringtop_n?: integerpraisonai.searchquery: stringpraisonai.ocrimage_path: stringmodel?: stringpraisonai.guardrails.checktext: stringguardrail_name?: stringpraisonai.memory.showuser_id?: stringpraisonai.memory.add changescontent: stringmetadata?: stringpraisonai.memory.searchquery: stringlimit?: integeruser_id?: stringpraisonai.memory.clear deletespraisonai.knowledge.add changessource: stringpraisonai.knowledge.queryquery: stringlimit?: integerpraisonai.knowledge.listpraisonai.knowledge.clear deletespraisonai.knowledge.statspraisonai.rag.queryquery: stringcollection?: stringpraisonai.rules.listpraisonai.rules.showrule_name: stringpraisonai.rules.create deletesrule_name: stringcontent: stringpraisonai.rules.delete deletesrule_name: stringpraisonai.todo.listpraisonai.todo.add changescontent: stringpriority?: stringpraisonai.todo.complete changestodo_id: stringpraisonai.todo.delete deletestodo_id: stringpraisonai.schedule.listpraisonai.schedule.add changestask_name: stringcron: stringworkflow_path: stringpraisonai.schedule.remove deletestask_name: stringpraisonai.session.listpraisonai.session.infosession_id: stringpraisonai.session.delete deletessession_id: stringpraisonai.files.create changesfile_path: stringpurpose?: stringpraisonai.files.listpurpose?: stringpraisonai.files.delete deletesfile_id: stringpraisonai.batches.create changesinput_file_id: stringendpoint?: stringcompletion_window?: stringpraisonai.batches.cancel changesbatch_id: stringpraisonai.vector_stores.create changesname: stringfile_ids?: arraypraisonai.vector_stores.searchvector_store_id: stringquery: stringmax_results?: integerpraisonai.assistants.create changesname: stringinstructions: stringmodel?: stringtools?: arraypraisonai.fine_tuning.create changestraining_file: stringmodel?: stringsuffix?: stringpraisonai.containers.create changesname: stringimage?: stringpraisonai.containers.file_write deletescontainer_id: stringfile_path: stringcontent: stringpraisonai.a2a.send changesagent_url: stringmessage: stringtask_id?: stringpraisonai.skills.loadskill_path: stringpraisonai.tools.searchquery: stringpraisonai.mcp_config.enable changesconfig_name: stringpraisonai.doctor.envpraisonai://memory/sessionspraisonai://workflowspraisonai://toolspraisonai://agentspraisonai://knowledge/sourcespraisonai://configpraisonai://mcp/statusdeep-researchcode-reviewworkflow-autoguardrail-checkcontext-engineeringeval-criteriaagent-instructions