{"name":"ai.flowdot/mcp-server","slug":"flowdot-mcp-server","title":"FlowDot","description":"Build and run AI workflows, apps, toolkits and knowledge bases on FlowDot from any MCP client.","url":"https://mcp.market/server/flowdot-mcp-server","rating":null,"grade":"B","score":72,"certified":false,"status":"active","category":"other","tags":[],"presence":{"score":27,"stars":0,"forks":0,"downloads_week":68,"last_push_at":"2026-10-04T19:31:13.000Z","license":"NOASSERTION"},"uptime":null,"claimed":false,"transport":"npm","callable_via_gateway":false,"default_price_micros":0,"repository":"https://github.com/flowdot-llc/mcp-server","website":"https://flowdot.ai/mcp","version":"1.3.21","remotes":[],"packages":[{"registryType":"npm","identifier":"@flowdot.ai/mcp-server","version":"1.3.21","transport":{"type":"stdio"},"environmentVariables":[{"description":"Your FlowDot MCP token (starts with fd_mcp_). Create one free at https://flowdot.ai/mcp","isRequired":true,"format":"string","isSecret":true,"name":"FLOWDOT_API_TOKEN"},{"description":"FlowDot Hub URL. Defaults to https://flowdot.ai","format":"string","default":"https://flowdot.ai","name":"FLOWDOT_HUB_URL"}]}],"tools":[{"name":"add_connection","description":"Create a connection between two nodes in a workflow. Connects an output socket to an input socket.","write_action":true,"price_micros":0,"input_schema":null},{"name":"add_custom_node_comment","description":"Add a comment to a custom node. Can also be used to reply to existing comments.","write_action":false,"price_micros":0,"input_schema":null},{"name":"add_node","description":"Add a new node to a workflow. Supports built-in nodes, custom nodes, and toolkit-tool nodes. For custom nodes, use \"custom_node_{hash}\". For a tool from an INSTALLED toolkit, use \"toolkit_{toolkitId}_{toolName}\" (e.g. \"toolkit_xS03HmGAag_get_markets\") — the tool's inputs become input sockets, each required credential becomes a \"_cred_<KEY>\" input resolved from your installation, and the node outpu","write_action":false,"price_micros":0,"input_schema":null},{"name":"add_recipe_store","description":"Add a new store (variable) to a recipe. Stores hold data that flows between steps. **Store Types:** - **Input stores** (is_input: true): Values user provides when running - **Output stores** (is_output: true): Values returned after execution - **Internal stores**: Temporary values used during execution **IMPORTANT - The `request` Convention:** When users run a recipe with a task argument like: `fl","write_action":false,"price_micros":0,"input_schema":null},{"name":"add_shared_result_comment","description":"Add a comment to a shared execution result.","write_action":false,"price_micros":0,"input_schema":null},{"name":"add_workflow_comment","description":"Add a comment to a workflow. You can only comment on public workflows or your own workflows.","write_action":false,"price_micros":0,"input_schema":null},{"name":"agent_chat","description":"Chat with the FlowDot AI agent. The agent can help discover workflows, suggest which workflow to run, and explain workflow capabilities.","write_action":false,"price_micros":0,"input_schema":null},{"name":"append_app_code","description":"Appends content to the end of app code. CRITICAL: Remember export rules: - App entry file MUST end with: export default MyAppName; - When appending, content goes AFTER the closing brace but BEFORE the export - Use insert_app_code if you need to place code before the export statement Use this tool when you need to: - Add helper functions after the main component - Add additional components at the e","write_action":false,"price_micros":0,"input_schema":null},{"name":"audit_property","description":"Audit a FlowDot property — a deterministic, full-scope inspection of what it can DO and REACH — before recommending, installing, or running it. **What you get back** - **Capability tags** at a glance: `network`, `knowledge_base`, `llm`, `file`, `external_effect`, `toolkit`, `credentials`, `sub_invoke`, `human_gate`. - **Network calls** — the literal outbound hosts + methods it can hit. - **Knowled","write_action":false,"price_micros":0,"input_schema":null},{"name":"browse_community_input_presets","description":"Browse community-shared input presets across ALL workflows on the platform. Returns only presets the author has opted in to community visibility (`is_community=true`). This is the preset equivalent of `get_public_workflows`. To run one: read the preset's `inputs` payload, then call `execute_workflow` against the preset's parent workflow with those inputs. The parent workflow hash is returned with ","write_action":false,"price_micros":0,"input_schema":null},{"name":"browse_recipes","description":"Browse public agent recipes shared by other users. Search by name, category, or tags.","write_action":false,"price_micros":0,"input_schema":null},{"name":"browser_act","description":"Perform one UI action. action ∈ click | double_click | right_click | type | clear | press_key | scroll | hover | wait | upload_file | select_option | navigate. target = element text/selector/coords; value = text/key/url/file-path.","write_action":false,"price_micros":0,"input_schema":null},{"name":"browser_close","description":"Close one browser/Electron session and free its resources.","write_action":false,"price_micros":0,"input_schema":null},{"name":"browser_describe","description":"Read the current page: title, url, headings, interactive elements (with selectors), visible text, forms, modals, and errors. The primary observation channel — use before acting.","write_action":false,"price_micros":0,"input_schema":null},{"name":"browser_fill_form","description":"Fill many form fields in one call, each with the correct interaction for its type (react-select, autocomplete, file upload, radio, checkbox). Autocomplete fields with no matching suggestion are left blank and reported failed — never filled with a wrong value.","write_action":false,"price_micros":0,"input_schema":null},{"name":"browser_find","description":"Find candidate elements matching a natural-language description or text. Returns ranked selectors.","write_action":false,"price_micros":0,"input_schema":null},{"name":"browser_launch","description":"Open a web page in a real browser, OR launch an Electron app to QA it. Returns a session_id used by every other browser_* tool. Prefers your system Chrome/Edge (no download). Requires Playwright (optional dependency); returns an install hint if unavailable. Read the `learn://browser-driving` resource first for the observe→act loop and limits.","write_action":false,"price_micros":0,"input_schema":null},{"name":"browser_list_sessions","description":"List all open browser/Electron sessions.","write_action":false,"price_micros":0,"input_schema":null},{"name":"browser_navigate","description":"Navigate a browser session to a new URL. Blocked from reaching the internal FlowDot node server (hub-mode).","write_action":false,"price_micros":0,"input_schema":null},{"name":"browser_read_form","description":"Return a schema of the page's main form: each field's label, ref, type (text|native-select|react-select|autocomplete|file|radio|checkbox|...), required flag, value, and dropdown options. Reads the TOP document only (iframed boards not covered). Use before browser_fill_form.","write_action":false,"price_micros":0,"input_schema":null},{"name":"browser_screenshot","description":"Capture a PNG of the current page. Returns a base64 image (or writes to save_path if given).","write_action":false,"price_micros":0,"input_schema":null},{"name":"browser_sequence","description":"Run several actions in one call (fast, fewer round-trips). Each item is { action, target?, value? }.","write_action":true,"price_micros":0,"input_schema":null},{"name":"browser_wait_for","description":"Wait until a selector or text appears (up to a timeout).","write_action":false,"price_micros":0,"input_schema":null},{"name":"cancel_decision","description":"Request cancellation of one of your decision calls. Best-effort once dispatched; a finished call is only acknowledged.","write_action":true,"price_micros":0,"input_schema":null},{"name":"cancel_execution","description":"Cancel a running workflow execution. Only works on executions with status \"running\" or \"pending\".","write_action":true,"price_micros":0,"input_schema":null},{"name":"checkpoint_recipe","description":"Create a manual checkpoint snapshot of a recipe. Unlike auto-snapshots (which coalesce within 60 seconds), a checkpoint is always recorded as its own version with parent_kind=\"checkpoint\". Use before a multi-step rewrite so you can restore precisely to this point.","write_action":true,"price_micros":0,"input_schema":null},{"name":"clone_app","description":"Clone a public app to your library. Creates a private copy that you can customize. The cloned app will: - Be owned by you - Start as private (not published) - Have all the original code and configuration - Not include linked workflows (you'll need to link your own)","write_action":false,"price_micros":0,"input_schema":null},{"name":"convert_document","description":"Convert a document to another format; the output extension sets the target. Supported:","write_action":false,"price_micros":0,"input_schema":null},{"name":"copy_custom_node","description":"Copy a public custom node to your library. The copy will be private by default.","write_action":false,"price_micros":0,"input_schema":null},{"name":"create_agent_character","description":"Create a new agent character (voice-call persona). All voice/STT/LLM/persona fields are required — the Hub rejects incomplete characters at save time with code CHARACTER_VOICE_CONFIG_INCOMPLETE. See learn://characters for recommended per-provider values.","write_action":true,"price_micros":0,"input_schema":null},{"name":"create_app_file","description":"Create a new file in a multi-file FlowDot app. Creates a new file with the specified path and content. File constraints: - Max file size: 100KB per file - Max total app size: 512KB across all files - Allowed extensions: jsx, js, tsx, ts, css, json, md - No path traversal (../) allowed - No hidden files (starting with .)","write_action":true,"price_micros":0,"input_schema":null},{"name":"create_custom_node","description":"Create a new custom node with inputs, outputs, and script code. SCRIPT FORMAT (REQUIRED): ```javascript function processData(inputs, properties, llm) { // Access inputs by their exact names const myInput = inputs.InputName || ''; const myProp = properties.propertyKey; // Your logic here // Return object with keys matching output names EXACTLY return { OutputName: result }; } ``` VALID DATA TYPES: ","write_action":true,"price_micros":0,"input_schema":null},{"name":"create_document","description":"Create a new document at a local path; the file extension sets the format","write_action":true,"price_micros":0,"input_schema":null},{"name":"create_input_preset","description":"Create a new input preset (community input) for a workflow. This allows you to share pre-configured input values with others.","write_action":true,"price_micros":0,"input_schema":null},{"name":"create_knowledge_category","description":"Create a new category to organize documents in your knowledge base. Categories help group related documents for targeted RAG queries. Can create personal or team categories.","write_action":true,"price_micros":0,"input_schema":null},{"name":"create_recipe","description":"Create a new agent recipe. Recipes are reusable agent orchestration workflows. **After Creating:** 1. Save the returned hash - you need it for all subsequent operations 2. Add input stores (is_input: true) - **name primary input `request`** (every run surface passes the task as `inputs.request`: CLI `--input`, the native app's Run Focus, and the coding chat's `run_recipe`) 3. Add output stores (is","write_action":true,"price_micros":0,"input_schema":null},{"name":"create_shared_result","description":"Create a shareable link for a workflow execution result. This allows you to share specific execution outputs with others.","write_action":true,"price_micros":0,"input_schema":null},{"name":"create_workflow","description":"Create a new empty workflow with a name and optional description. The workflow will be private by default.","write_action":true,"price_micros":0,"input_schema":null},{"name":"delete_agent_character","description":"Permanently delete an agent character. Requires confirm: true. This is irreversible — any voice-call session in flight will fail with a 404 on its character lookup.","write_action":true,"price_micros":0,"input_schema":null},{"name":"delete_app","description":"Permanently delete an app. This action cannot be undone. The app and all its associated data (comments, votes, etc.) will be removed. Existing clones of the app will continue to work for their owners.","write_action":true,"price_micros":0,"input_schema":null},{"name":"delete_app_file","description":"Delete a file from a multi-file FlowDot app. Permanently removes the file from the app. This action cannot be undone. Note: Deleting the entry point file will require you to set a new entry point using set_app_entry_file.","write_action":true,"price_micros":0,"input_schema":null},{"name":"delete_connection","description":"Remove a connection between two nodes in a workflow.","write_action":true,"price_micros":0,"input_schema":null},{"name":"delete_custom_node","description":"Delete a custom node. This action cannot be undone.","write_action":true,"price_micros":0,"input_schema":null},{"name":"delete_image","description":"Delete one of your uploaded images by id. Removes the stored file and frees the storage it used. Only your own images can be deleted.","write_action":true,"price_micros":0,"input_schema":null},{"name":"delete_input_preset","description":"Delete an input preset. You can only delete presets you created.","write_action":true,"price_micros":0,"input_schema":null},{"name":"delete_knowledge_category","description":"Delete a knowledge base category. Documents in the category will become uncategorized (not deleted).","write_action":true,"price_micros":0,"input_schema":null},{"name":"delete_knowledge_document","description":"Permanently delete a document from your knowledge base. This removes the file and all associated chunks/embeddings.","write_action":true,"price_micros":0,"input_schema":null},{"name":"delete_node","description":"Delete a node from a workflow. This also removes all connections to/from the node.","write_action":true,"price_micros":0,"input_schema":null},{"name":"delete_recipe","description":"Permanently delete an agent recipe. This action cannot be undone.","write_action":true,"price_micros":0,"input_schema":null},{"name":"delete_recipe_step","description":"Delete a step from a recipe. References to this step will need to be updated.","write_action":true,"price_micros":0,"input_schema":null},{"name":"delete_recipe_store","description":"Delete a store from a recipe. Steps using this store will need to be updated.","write_action":true,"price_micros":0,"input_schema":null},{"name":"delete_workflow","description":"Permanently delete a workflow. This action cannot be undone. Only the workflow owner can delete it.","write_action":true,"price_micros":0,"input_schema":null},{"name":"document_template","description":"Manage saved document templates: a named spec you build from repeatedly, with per-use","write_action":false,"price_micros":0,"input_schema":null},{"name":"duplicate_agent_character","description":"Duplicate one of your own agent characters. Unlike fork, this copies the full LLM choice as well — useful for spinning up a variant.","write_action":false,"price_micros":0,"input_schema":null},{"name":"duplicate_workflow","description":"Create a copy of an existing workflow. The new workflow will be private and editable.","write_action":true,"price_micros":0,"input_schema":null},{"name":"edit_app_code","description":"Performs exact string replacement in app code. Similar to find-and-replace. CRITICAL: Remember these rules when editing code: - NO IMPORTS - React is global - MUST include export default at the end: export default MyAppName; - NO FORM ELEMENTS - Use div + button with type=\"button\" instead - Workflow results: Use getNodeOutput(result, nodeTitle) helper - ALL BUTTONS need type=\"button\" attribute Use","write_action":false,"price_micros":0,"input_schema":null},{"name":"edit_document","description":"Apply structured edits to a document in place and save it. Ops:","write_action":false,"price_micros":0,"input_schema":null},{"name":"email_archive","description":"Archive an email message (removes from inbox). Subject to mailbox grant permissions.","write_action":true,"price_micros":0,"input_schema":null},{"name":"email_delete","description":"Move an email message to trash. Subject to mailbox grant permissions. This is a soft delete (trash), not permanent.","write_action":true,"price_micros":0,"input_schema":null},{"name":"email_draft","description":"Create an email draft in a connected mailbox. The draft is saved but not sent.","write_action":true,"price_micros":0,"input_schema":null},{"name":"email_label","description":"Add or remove labels on an email message. Subject to mailbox grant permissions.","write_action":true,"price_micros":0,"input_schema":null},{"name":"email_list_threads","description":"List email threads from a connected mailbox. Returns recent threads with subject, participants, and message count.","write_action":true,"price_micros":0,"input_schema":null},{"name":"email_read","description":"Read a specific email message by ID. Returns full message content including headers, body, and attachments list.","write_action":true,"price_micros":0,"input_schema":null},{"name":"email_reply","description":"Reply to an email message. Subject to mailbox grant permissions.","write_action":true,"price_micros":0,"input_schema":null},{"name":"email_search","description":"Search emails in a connected mailbox. Requires an active email integration.","write_action":true,"price_micros":0,"input_schema":null},{"name":"email_send","description":"Send an email through a connected mailbox. Subject to mailbox grant permissions —","write_action":true,"price_micros":0,"input_schema":null},{"name":"execute_decision","description":"Run a typed Jev decision (noul yes/no, choice, score) and wait for the result. SPENDS the user's credits","write_action":true,"price_micros":0,"input_schema":null},{"name":"execute_workflow","description":"Execute a FlowDot workflow by ID. Use list_workflows first to get available workflow IDs.","write_action":true,"price_micros":0,"input_schema":null},{"name":"get_decision","description":"Read one of your decision calls by call_id (status, settlement, answers when available). Never creates work.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_document_info","description":"Get a document's structured outline: format, per-format summary (counts of slides/pages/sheets/paragraphs),","write_action":false,"price_micros":0,"input_schema":null},{"name":"inspect_document","description":"File-level PDF detail an outline cannot carry: byte size on disk, page count, every","write_action":false,"price_micros":0,"input_schema":null},{"name":"learn_about","description":"Load a FlowDot area: returns a short how-to AND unlocks that area's full","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_decision_models","description":"List decision models with primitives, limits, price per million input tokens, availability and whether this connection may execute/read/cancel.","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_my_resources","description":"List the current user's existing FlowDot resources of a given type (so you can","write_action":false,"price_micros":0,"input_schema":null},{"name":"mcp__flowdot__add_toolkit_comment","description":"Add a comment to a toolkit. Share feedback, ask questions, or discuss the toolkit with the community.","write_action":false,"price_micros":0,"input_schema":null},{"name":"mcp__flowdot__check_toolkit_credentials","description":"Check credential status for a toolkit installation. Shows which credentials are required and which are missing.","write_action":false,"price_micros":0,"input_schema":null},{"name":"mcp__flowdot__copy_agent_toolkit","description":"Copy/duplicate a toolkit. Creates a private copy of a toolkit that you can customize.","write_action":false,"price_micros":0,"input_schema":null},{"name":"mcp__flowdot__create_toolkit_tool","description":"Create a new tool in a toolkit. Add HTTP or Workflow-based tools to your agent toolkit with custom input/output schemas and credentials. For signed-request crypto exchange APIs (Robinhood Crypto, Binance, etc.), use endpoint_config.signing to declare the algorithm and message template — the Hub computes a fresh signature on every request.","write_action":true,"price_micros":0,"input_schema":null},{"name":"mcp__flowdot__delete_agent_toolkit","description":"Delete a toolkit permanently. WARNING: This cannot be undone. All tools, installations, and related data will be deleted.","write_action":true,"price_micros":0,"input_schema":null},{"name":"mcp__flowdot__delete_toolkit_tool","description":"Delete a tool from a toolkit. WARNING: This cannot be undone. The tool will be permanently removed.","write_action":true,"price_micros":0,"input_schema":null},{"name":"mcp__flowdot__favorite_toolkit","description":"Add or remove a toolkit from your favorites.","write_action":false,"price_micros":0,"input_schema":null},{"name":"mcp__flowdot__get_agent_toolkit","description":"Get detailed information about a specific agent toolkit. Returns comprehensive toolkit details including tools, credentials, and metadata.","write_action":false,"price_micros":0,"input_schema":null},{"name":"mcp__flowdot__get_toolkit_comments","description":"Get comments on a toolkit. View community feedback and discussions about a toolkit.","write_action":false,"price_micros":0,"input_schema":null},{"name":"mcp__flowdot__get_toolkit_tool","description":"Get detailed information about a specific tool in a toolkit. Shows input schema, configuration, and requirements.","write_action":false,"price_micros":0,"input_schema":null},{"name":"mcp__flowdot__install_toolkit","description":"Install a toolkit to your account. After installation, you can configure credentials and use the toolkit's tools.","write_action":false,"price_micros":0,"input_schema":null},{"name":"mcp__flowdot__invoke_toolkit_tool","description":"Execute a tool from an installed toolkit. Runs the tool with provided inputs using your configured credentials. You can optionally pass credential_overrides to provide dynamic credentials (like tokens from a previous tool call).","write_action":true,"price_micros":0,"input_schema":null},{"name":"mcp__flowdot__list_agent_toolkits","description":"List your own MCP agent toolkits with optional filtering. Toolkits are collections of custom tools that can be installed and used by AI agents. Each toolkit can contain multiple related tools with shared credentials and configuration.","write_action":false,"price_micros":0,"input_schema":null},{"name":"mcp__flowdot__list_installed_toolkits","description":"List all toolkits you have installed. Shows installation status and credential configuration for each toolkit.","write_action":false,"price_micros":0,"input_schema":null},{"name":"mcp__flowdot__list_toolkit_tools","description":"List all tools in a toolkit. Shows tool names, descriptions, and types (HTTP or Workflow).","write_action":false,"price_micros":0,"input_schema":null},{"name":"mcp__flowdot__search_agent_toolkits","description":"Search the public MCP toolkit marketplace for toolkits created by other users. Discover reusable tool collections for various use cases like API integrations, data processing, automation, and more.","write_action":false,"price_micros":0,"input_schema":null},{"name":"mcp__flowdot__test_toolkit_installation","description":"Run a Test Connection diagnostic against an installed toolkit. Resolves the toolkit's health-check tool (the one designated by `health_check_tool_id`, or auto-detected as the first GET-method HTTP tool with no required inputs) and invokes it with empty inputs. Returns a structured diagnostic outcome. Use this to verify a toolkit is actually working before running production tools. Possible `test_o","write_action":true,"price_micros":0,"input_schema":null},{"name":"mcp__flowdot__toggle_toolkit_active","description":"Enable or disable a toolkit installation. Inactive toolkits won't be available for use but remain installed.","write_action":false,"price_micros":0,"input_schema":null},{"name":"mcp__flowdot__toggle_toolkit_visibility","description":"Change toolkit visibility (private, public, or unlisted). Public toolkits are searchable by others. Unlisted are accessible via direct link only.","write_action":false,"price_micros":0,"input_schema":null},{"name":"mcp__flowdot__uninstall_toolkit","description":"Uninstall a toolkit from your account. Removes the installation and credential mapping (toolkit itself remains available).","write_action":false,"price_micros":0,"input_schema":null},{"name":"mcp__flowdot__update_agent_toolkit","description":"Update an existing agent toolkit's metadata. Modify title, description, category, tags, and other toolkit properties. ## Updating the public README Use `readme` to set the GitHub-style markdown README shown on the public toolkit page (`/toolkit/{hash}`). Only the toolkit's author (or a team member with edit rights) can change it. Pass an empty string to clear it. Max 100,000 characters. ## Updatin","write_action":true,"price_micros":0,"input_schema":null},{"name":"mcp__flowdot__update_toolkit_installation","description":"Update toolkit installation (configure credential mapping). Map toolkit credential requirements to your stored API keys.","write_action":true,"price_micros":0,"input_schema":null},{"name":"mcp__flowdot__update_toolkit_tool","description":"Update an existing tool in a toolkit. Modify tool configuration, schemas, endpoints, or credentials.","write_action":true,"price_micros":0,"input_schema":null},{"name":"mcp__flowdot__vote_toolkit","description":"Vote on a toolkit (upvote, downvote, or remove your vote).","write_action":false,"price_micros":0,"input_schema":null},{"name":"merge_documents","description":"Concatenate PDFs into a single file, in the order given. Page content only —","write_action":false,"price_micros":0,"input_schema":null},{"name":"read_document","description":"Read the full text of a local document (pdf, docx, pptx, xlsx, md, txt, csv) by file path.","write_action":false,"price_micros":0,"input_schema":null}],"scan":{"score":72,"grade":"B","scanned_at":"2026-10-14T12:22:13.849Z","report":{"scannerVersion":"0.1.10","scannedAt":"2026-10-14T12:22:13.841Z","components":{"code":{"score":20,"max":25,"notes":["388 source files scanned"]},"reliability":{"score":-1,"max":20,"notes":["no gateway calls yet and no remote to probe"]},"poisoning":{"score":-1,"max":15,"notes":["tools not inspected (local package is not executed); not counted"]},"auth":{"score":6,"max":15,"notes":["static API keys via environment variables"]},"maintenance":{"score":15,"max":15,"notes":["last push 10 days ago"]},"identity":{"score":6,"max":10,"notes":["namespace and repository owner differ","website matches verified namespace"]}},"findings":[{"id":"exec.eval","severity":"medium","component":"code","title":"eval / new Function used","evidence":"dist/utils/script-validator.js: … { pattern: /\\beval\\s*\\(/, msg: 'eval() is blocked in sandbox' }, { pa…"}],"inputs":{"packages":[{"registryType":"npm","identifier":"@flowdot.ai/mcp-server","version":"1.3.21","found":true,"license":"SEE LICENSE IN LICENSE","hasInstallScripts":false,"dependencyCount":11,"publishedAt":"2026-10-04T20:10:34.419Z","repositoryUrl":"git+https://github.com/flowdot-llc/mcp-server.git","weeklyDownloads":68}],"repo":{"found":true,"owner":"flowdot-llc","repo":"mcp-server","archived":false,"pushedAt":"2026-10-04T19:31:13Z","stars":0,"forks":0,"openIssues":0,"ownerType":"Organization","ownerAvatarUrl":"https://avatars.githubusercontent.com/u/252499705?v=4","ownerCreatedAt":"2026-01-01T21:25:31Z","license":"NOASSERTION"},"icon":{"url":"https://flowdot.ai/flowdot.png","source":"site","width":512,"height":512},"presence":{"stars":0,"forks":0,"downloadsWeek":68,"license":"NOASSERTION","lastPushAt":"2026-10-04T19:31:13.000Z","score":27}}}},"grade_history":[],"reviews":[]}