Integrate Dify MCP server into your Slack workspace for instant access to your AI agent.
Tools that your AI agent can use through this MCP server to interact with Dify
Run the published workflow of the Dify app that the connected API key belongs to, and return its outputs. Only works for Workflow-type apps: a Chatflow, Chatbot, Agent, or Text Generator app's key returns a not_workflow_app error. Requires the workflow to be published; an unpublished workflow returns an invalid_param error. Use Get App Parameters first to learn the input variable names. Example: Inputs { "city": "San Francisco" }, User user-123 → { workflow_run_id, data: { id, status: "succeeded", outputs: { result: "..." }, total_tokens, elapsed_time } }. This action uses blocking response mode, which waits for the run to finish before returning; long-running workflows on Dify Cloud risk being cut off by the platform's 100-second edge proxy timeout, in which case the run may still complete server-side but this action will not see the result. See the documentation
List past runs of a Dify Workflow app, newest first, with each run's status, token usage, step count, and timing. Only Workflow apps record these logs: a Chatflow, Chatbot, Agent, or Text Generator app's key returns an empty page, not an error. For runs started through the API, created_by_end_user.session_id is the User value sent with that run, which is useful for tracing a run back to its caller and for filtering with User. Runs started by a team member inside Dify have created_by_end_user: null and an account under created_by_account instead. Each entry is a run-level summary; node-by-node execution logs for finished runs aren't available. Example: Status failed, Limit 5 → { data: [{ id, created_by_role: "end_user", created_by_end_user: { id, session_id: "user-123", type: "service-api" }, workflow_run: { id, status: "failed", error, total_tokens, elapsed_time } }], page: 1, limit: 5, total: 12, has_more: true }. If has_more is true, call again with Page incremented by one. See the documentation
Return a Dify Chatflow, Chatbot, Agent, or Legacy Agent conversation's message history. The first call returns the latest messages; page backward into older ones with First Message ID. Use List Conversations to find a Conversation ID. Each message includes the query/answer pair, so this is how an agent reconstructs prior turns of a conversation instead of relying on its own memory. By default each message is trimmed to id, conversation_id, query, answer, status, error, feedback, and created_at; set Include Full Details to also get retrieved knowledge-base passages (retriever_resources), agent reasoning (agent_thoughts), files, and token usage. Example: Conversation ID 45701982-8118-4bc5-8e9b-64562b4555f2, User user-123 → { data: [{ id, conversation_id, query: "What are the specs of the iPhone 13 Pro Max?", answer: "...", status: "normal", feedback: { rating: "like" }, created_at }], has_more: true, limit: 20 }. If has_more is true, call again with First Message ID set to the id of the first message in data to get older messages. See the documentation
List a Dify Chatflow, Chatbot, Agent, or Legacy Agent app's conversations, most recently active first. Conversations are scoped by User, so pass the same value used to create those conversations to see that end user's threads. Example: User user-123, Limit 20 → { data: [{ id, name: "iPhone Specs Chat", inputs, status: "normal", created_at, updated_at }], has_more: true, limit: 20 }. If has_more is true, call again with Last Conversation ID set to the id of the last conversation in data. Pass a conversation's id to List Messages to read it. See the documentation
Return the connected Dify app's configuration: its user_input_form (the exact input variable names, types, and which are required), file-upload limits, opening statement, and suggested questions. Call this before Run Workflow to know what to pass in its Inputs parameter, instead of guessing variable names. Example: an app with one required text variable returns { user_input_form: [{ "text-input": { variable: "city", label: "City", required: true, default: "" } }], opening_statement, suggested_questions, file_upload, ... }, so pass { "city": "..." } as Inputs. See the documentation