Skip to main content
Glama
759,132 tools. Updated 2026-11-08 18:10

"Steam Deck" matching MCP tools:

  • Run a Sieve IMPACT-X Quick Screen on a startup. Analyzes the company across 7 dimensions (Innovators, Market, Product, Advantage, Commerce, Traction, X-Factor) and returns an analysis ID. Takes 2-5 minutes to complete. Upserts -- if the company was previously screened, returns the existing deal (set confirm=true to re-screen). Two ways to use: - v3 (recommended): First add documents with sieve_dataroom_add, then call sieve_screen(deal_id=...) to analyze everything in the data room. - v2 (legacy): Call sieve_screen(company_name=..., website_url=...) directly. At least one of website_url or pitch_deck_text is required in this mode. Args: company_name: Name of the startup to screen (v2 flow, or to create new deal). deal_id: Screen an existing deal by ID (v3 flow -- use after sieve_dataroom_add). website_url: Company website URL (v2 flow). pitch_deck_text: Extracted pitch deck text (v2 flow). description: Brief company description (optional). confirm: Set to true to re-screen an existing deal.
    ConnectorNo auth
  • Append a new row to a workspace's table surface. The data field is a JSON object with column-name keys. Status column accepts: drafted, queued, sealed, active, blocked. Works on any workspace; columns auto-seed on the first row if the table surface is empty. Multi-surface workspaces accept `surface_slug` to target a specific sheet (use `list_surfaces` to enumerate); omit it to fall through to the workspace's primary table surface. **Unmapped data fields:** Keys in `data` that don't match any existing column are still STORED on the row (nothing is dropped), but they won't render in the table UI until the column exists. The response carries an `unmapped_fields` array listing those keys plus a human-readable `warning` so an agent can decide whether to surface them, call `add_column`, or retry with `auto_create_columns: true`. **Auto-create columns:** Pass `auto_create_columns: true` to have the server append a fresh text column for every unmapped key in one atomic step (humanised label from the key, type `text`). The response then includes `created_columns: ColumnDef[]` with the new column metadata. Use this when you're appending machine-emitted rows whose shape you can't predict ahead of time; leave it omitted (default false) when you want explicit schema control.
    ConnectorNo auth
  • Add or remove an emoji reaction to a comment. Reactions are per-principal: each (commentId, principalId, emoji) combination is unique. `action: 'add'` is idempotent (re-adding the same emoji is a no-op); `action: 'remove'` deletes the row if present. Fires `comment.reaction_added` / `comment.reaction_removed`. Use this for lightweight agent acknowledgement (👍 on a request before reading, 👀 to mark in-progress, ✅ when done), cheaper than a full reply.
    ConnectorNo auth
  • Searches the available bank connectors by name (pass keywords[], e.g. ['nubank','btg']) and returns, per match: the connector id, whether it's Open Finance or API (`access`), PF/PJ (`audience`), the user's already-linked connections (and accounts when include_accounts=true), and a ready `connect_url` with the bank pre-selected. Some non-Open-Finance credential connectors carry a `caveat` warning that they don't auto-update (needs periodic manual reconnection) — surface it so the user can prefer the institution's Open Finance connector for automation. Honors the user's plan (a PF plan hides PJ banks; a PJ plan covers BOTH — PF and PJ banks connect and count under the same plan). Call this BEFORE connecting to hand the user a one-click link to the right bank. keywords[] is REQUIRED — without it returns a hint (never dumps the whole catalog).
    ConnectorNo auth
  • Forces the bank to re-sync one or more connections NOW and WAITS for it to finish (PATCH /items/:id, then polls until the item stops updating, up to ~60s). Use this when a balance or transaction list looks stale: a connection can read UPDATED yet be hours old, and this pulls fresh data WITHOUT disconnecting/reconnecting. Pass `items` as an array of selectors (item_id, connector_id, connector_name, or the user-set custom_label nickname); OMIT `items` to sync ALL linked banks. Returns `{ results, errors }`; each result has the final `status`, `executionStatus`, `lastUpdatedAt` (advances when data is refreshed), and `synced` (true = fresh data is ready). `needs_action` (e.g. MFA_REINTERACTION / LOGIN_ERROR / WAITING_USER_INPUT) means the user must re-authenticate — those results include a `reconnect_url` that opens the widget in UPDATE mode for that exact connection (user enters credentials / MFA token, data refreshes in place, no slot consumed, no disconnect needed). `timed_out: true` means the sync is still running — re-check with openfinance_get_item_status. Set `wait: false` for fire-and-forget (returns immediately while UPDATING).
    ConnectorNo auth
  • Corrects the category of one or more transactions (PATCH /transactions/:id). Pass `items` as an array of { transaction_id, category_id } — `transaction_id` comes from openfinance_list_transactions, `category_id` from openfinance_list_categories. This overrides Pluggy's automatic categorization AND teaches Pluggy: recategorizing a transaction automatically creates a Category Rule for this client (case-insensitive exact match on the transaction's data), so FUTURE similar transactions are categorized the same way — use this to fix miscategorized transactions and improve categorization accuracy going forward. Batch shape: returns `{ updated, results: [{ transaction_id, category, categoryId }], errors: [{ id, status, message }] }` — per-item errors do not fail the whole batch.
    ConnectorNo auth

Matching MCP Servers

  • A
    license
    A
    quality
    B
    maintenance
    Enables MCP clients such as Claude to search and filter a Steam library, get explained Deck-friendly picks, and triage games into lanes, edit notes, reorder Up next, and refresh the library through a self-hosted Steam Backlog Triage dashboard.
    10
    MIT
  • A
    license
    B
    quality
    B
    maintenance
    A read-only Model Context Protocol server for Valve's public Steam Web API and storefront. Ask about your friends and games, playtime and achievements, plus account-independent things like sales, reviews, live player counts, Steam Deck compatibility, discovery, and recommendations — bring your own free Steam API key.
    41
    164 PyPI
    8
    MIT

Matching MCP Connectors

  • Build it. Rehearse it. Own the room. The hosted MCP server for Kadal Deck (deck.kadal.cc), which has your back for the whole talk, from the first idea to the last applause. Connect once with OAuth and your AI agent can list and inspect your decks, read a talk in progress (current slide, who is watching, polls and questions by votes), check analytics, change titles, visibility and passcodes, roll back versions, create share links, and quick-edit and publish decks through the web builder, with conflict-safe publishing that never overwrites newer work. Pair it with the local server (npx @kadal/deck mcp) to write, check and build decks on your machine. Open source.

  • Steam concurrent players by game over time, monthly trends and growth. Free key at trendsmcp.ai

  • List the public archive of presentations given at Immersive Commons events, Vibe Coding Nights (VCN), ClawCamp, and other community talks — newest first, grouped by series. No auth required. NOT to be confused with ic_resources_list (that lists bookable rooms). Use ic_presentations_get for one VCN session's detail. Args: { series?: string (e.g. 'VCN'|'ClawCamp'|'Talk'), format?: 'deck'|'slides'|'video'|'doc'|'link', limit?: number (max 200, default 100) }. Returns: { count, total, series: string[], scaffold, by_series: Array<{ series, presentations: P[] }>, presentations: P[] (flat) } where P = { session_no (number, VCN-only; null for non-VCN talks), series, title, date, format, public_url, deployed, speaker?, event?, summary? }. `scaffold:true` means placeholder data (real manifest not yet synced). `public_url` is a direct view/download link, null if unpublished (local-only).
    ConnectorNo auth
  • Log a grammar mistake the user just made in the target language, creating a grammar point in their Minddory deck. Use it proactively whenever the user writes a target-language sentence with a clear, correctable error (wrong tense, agreement, word_choice, word_order, missing or wrong article, preposition, gender, conjugation, spelling, pluralization). By connecting Minddory the user opted IN to automatic capture, so log it as you go - do not ask permission first or turn it into a yes/no question. The user connected Minddory to catch and review these patterns; you do not need to announce each log. Pass the original text + correction + error_type. Multiple mistakes in one message = multiple calls. VARIANT RULE: Always pass the user's full BCP-47 variant in the lang field (e.g. en-gb, not en) - get it from get_system_instructions on first turn. Before logging, check that the "error" is not actually a valid regional variant form (US past-simple vs UK present-perfect with "just/already", US "in the hospital" vs UK "in hospital", US "color" vs UK "colour", BR gerund vs PT "a + infinitive", etc.). When the variant is unspecified (base ISO only), treat ALL regional forms as valid. Better to skip a borderline call than to mark a valid variant form as wrong. error_type must be one of: tense, agreement, word_choice, word_order, article, preposition, spelling, pluralization, conjugation, gender, other. Feeds the user's Grammar Patterns view at app.minddory.com/grammar.
    ConnectorNo auth
  • Start a demo of the EMAIL channel, which runs against your user's own real inbox rather than in this conversation. Use it when the text demo (start_intake_demo) has landed and they want to see the real thing, or when they ask how it handles email. How it works: this returns an address and a reference code. Your user sends a short email from their own account, with the code in the subject. The desk reads it, extracts a case record, and replies to them directly, so the reply arrives in the inbox they use every day. Poll check_email_demo until it reports stage "sent". Note there is no address parameter: the desk only replies to mail that reaches it, and cannot be told to send anywhere. Your user has to send the first message themselves.
    ConnectorNo auth
  • Create a follow-up tied to a person — a to-do for the relationship (e.g. 'send the deck', 'intro to Ana'). In Team context, pass team_id and assigned_to to create it for any teammate against a Team-visible relationship. RECOMMENDED: include both assigned_to and remind_at whenever ownership and timing are known; neither is required. @mention a name in `content` to link someone in the relationship owner's network. Read open ones via get_person (relationship.actions); close them with complete_action or edit them with update_action.
    ConnectorNo auth
  • Capability manifest of the hosted runners: LAMMPS version, installed packages, and every style by category with gpu=true (KOKKOS-accelerated) or gpu=false (exists, but runs on the pod's CPU cores at the GPU rate). Default = compact summary; runner=lammps&full=true returns the whole style table. Use preflight_deck to check a specific deck.
    ConnectorNo auth
  • Saves new words to the user's NextLang vocabulary for one language pair, so they join the spaced-repetition schedule. Use when the user asks to save or add words, for example from a text you discussed. Put each word in 'term' in the language being learned and its meaning in 'translation'; add a short example sentence when it helps. Words the user already has are skipped, not duplicated. Returns how many were added, already saved, or invalid. This is NextLang's own review list, quizzed through list_due_words and record_review, not a flashcard deck: when the user wants a deck to study in Anki, Quizlet, Mochi or Brainscape, use save_deck instead.
    ConnectorOAuth
  • List the symbols with a report plan SAVED on or after `report_date` (default: TODAY) — the real-time research get_latest_report can hand over right now, and whether each is current or has a newer event since. A plan is saved the moment a material event publishes for a symbol (eps_update, eps_release, 8k_release, financials_release, ir_publication, transcript_update) and nightly for company_update. This tool is the INVENTORY of those plans — it does not build or return a report. Returns `plans`, newest plan first: {"plans": [{"symbol": "NVDA", "event_type": "eps_release", "planned_at": "<iso>", # when the plan was built "queued_at": "<iso>", # the report inputs (the event) it was built from "fresh": true, # see below "source": "redis"}, ...]} # redis = built within 3 days, s3 = older durable copy `fresh` applies the SAME rule get_latest_report (/get-cached-reports) applies: fresh: true -> the report get_latest_report([ticker]) returns was written from this plan and reflects the latest event. These are the names to pull. fresh: false -> a newer event landed after the plan. Its own report may still be in progress (minutes); otherwise get_latest_report returns the older PDF flagged stale, and generate_report_for_stock(ticker) writes a new note in a few minutes. Say so before the user waits on it. not listed -> no plan IN THE WINDOW. An empty result does not mean there is no research — it means nothing was planned in the window. Widen `report_date` before concluding a symbol has no plan; only then is a first generate_report_for_stock note (a few minutes) the answer (or `onboard_symbol` if the ticker is not covered). TWO WAYS IN: 1) Event-first — list_realtime_events(event_type=...) shows what just published; call this with event_types=[<that type>] to confirm which of those symbols have a plan and which are fresh, then get_latest_report(symbols=[...]) for the ones the user wants. (An event in the 12h cache with no plan here means the plan is still being built — check again in a minute.) 2) Research-first — skip the events step: call this with no filter for every symbol planned TODAY, grouped by the event that triggered it. Plans stay listed for 7 days, so pass report_date="YYYY-MM-DD" (e.g. 3 days back) when the user wants the running inventory rather than today's, or when today's list comes back thin. PICKING THE MOST PERTINENT PLANS ("pull the most relevant reports today", "what's worth reading right now"): the list is an inventory, not a ranking — a nightly company_update plan sits next to a transcript that just landed. Rank by the EVENT, not by the plan: a) FILTER on what published — list_realtime_events for the material types (transcript_update, 8k_release, ir_publication, eps_release / eps_update, financials_release) and for the tape (biggest_mover, biggest_loser, biggest_gainer). A symbol on BOTH lists — a filing or call AND a move — is the strongest candidate. b) ANALYZE the content — read the event payloads (what the 8-K discloses, what the call said, what the deck guides to) and keep the ones that change something; get_event_ontology(event_type=...) says what each type means. c) CONFIRM with intraday price action — detect_intraday_outlier_jumps(tickers=[...]) (and get_aftermarket_data after the close) shows whether the market treated it as significant; a print with no reaction ranks below a mover with a filing. d) MATCH to plans — call this tool with event_types=[<the types from a>] and keep the candidates that appear, preferring `fresh: true`; `queued_at` should be the event you just read. e) PULL the winners — get_latest_report(symbols=[...]) for the few that survived, not the whole list: every one comes back in seconds, flagged fresh or stale. Tell the user which is which, and offer generate_report_for_stock (a few minutes each) only if they want to wait. Not `get_latest_report`: that PULLS the reports for named tickers (each one's latest document). This tool answers "for which symbols could I get a fresh report?" — by event, across the universe — before anything is pulled. Not `generate_research_report`: that is the broad, topical, or multi-company writeup; the plans listed here are single-symbol, event-anchored reports. Synchronous, cheap (500/hour). Requires auth (your MCP client attaches the OAuth bearer automatically).
    ConnectorOAuth
  • Find arbitrage opportunities on Polymarket via monotonicity violations + partition-sum checks. Call with NO args for a `trending_scan` of the top ~200 markets by weekly volume; pass `event` for the strongest per-event partition_check, or `topic` for a themed cross-event scan. `event` (recommended for a specific market): pass a Polymarket event slug like "fed-decision-may-2026" or "when-will-bitcoin-hit-150k"; walks child markets, checks date-axis / threshold-axis ordering AND computes the partition_check (sum of YES prices across mutually-exclusive legs — should ≈1; deviations >3pp emit a BUY/SELL EVERY LEG signal). `topic` (for cross-event scanning): pass a seed question like "Strait of Hormuz traffic returns to normal" or "Fed rate decision"; searches related events across the platform, flattens markets, runs the comparator on the union. Cross-event mode catches "...by May 31" vs "...by Jun 30" patterns that single-event misses. SEMANTIC ANCHOR: cross-event pairs require ≥0.30 Jaccard similarity on question tokens (prevents Powell-Fed-Pause being paired with Powell-DOJ-probe); skipped_low_similarity surfaces the rejected pair count. PARTITION FILTER: drops will-person-X / will-manager-Y / will-someone-else- placeholder slugs; partitions with >20% placeholder fraction return null arb signal. Response: opportunities[] (gap_pp, suggested_trade, reasoning, monotonicity violation context), and in event mode partition_check{sum_yes_prices, gap_from_1, placeholders_filtered, suggested_trade}. FEES: every opportunities[] row and partition_check.arbitrage carry edge_pp_gross (== gap_pp / overround_pp), fees_pp, edge_pp_net, net_positive, plus polymarket_fee_pp, fee_basis and fee_categories[]. BOTH cost components are modeled: Polymarket's own per-category TAKER FEE (fee = shares × rate × p × (1-p), rates crypto 0.07 / sports-economics-culture-weather-other 0.05 / finance-politics-mentions-tech 0.04, geopolitics and world events fee-free; verified against Polymarket's own docs as of 2026-09-13) and Polygon gas (~$0.02/leg). The taker fee dominates: ~$1.75 per 100 shares on a crypto market at 50c versus $0.02 of gas, so rows that looked profitable before fleet #1927 may now show net_positive:false — that is the correction, not a regression. Each leg is priced at ITS OWN market's rate and price (the fee curve peaks at 50c and falls toward both extremes). fee_basis says where the rate came from: 'payload' (read off the market, the normal case), 'category' (mapped from its fee category), 'fee_free', or 'fallback' (rate unknown — charged at the modal 0.05 rather than assumed free, so an unreadable market is never reported as costless). Where fill_check reprices against live depth, this does NOT double-count that spread cost. FILL CHECK: when the partition signal fires, arbitrage.fill_check prices it against live CLOB depth (theoretical_edge_pp_at_book vs realizable_edge_pp at 1000 shares/leg, thin_legs[]) — realizable_edge_pp ≤ 0 means the overround exists only at last-trade, not in the book; do not trade it. For custom sizing use polymarket_fill_risk.
    ConnectorNo auth
  • Draws N unique random cards from the 78-card deck using cryptographic randomness (Python secrets.SystemRandom). Every call is independent — there is no session state. WORKFLOW: BEFORE: None — standalone. AFTER: None — interpret drawn cards using their active_meaning and active_keywords fields. INPUT CONTRACT: count (int 1–78, default 1) — Number of unique cards to draw. Example: 1 (daily pull), 3 (simple reading), 10 (Celtic Cross), 78 (full deck shuffle). Values outside 1–78 are rejected locally with MCP INVALID_PARAMS. allow_reversed (bool, default false) — When true, each drawn card independently has a 50% chance of reversal (cryptographically random, not seeded). DO NOT CONFUSE WITH: asterwise_get_tarot_card_of_the_day — deterministic daily card, same for all callers. asterwise_get_tarot_three_card_spread — positional read with named positions and meanings. asterwise_get_tarot_celtic_cross — 10-card positional spread. Full output and error contract: https://docs.asterwise.com/mcp/tools/draw-tarot-cards/
    ConnectorOAuth
  • Replace a single section of a workspace's doc body, identified by its heading text. The targeted edit complement to `update_doc` (full replacement) and `append_doc_section` (append-only at the end). Use this when the agent maintains a recurring section (e.g., a 'Status' block in a launch-prep doc, an 'Outcomes' block in a meeting note) and only needs to refresh that one piece. Without it, agents are forced into 'GET → splice → PUT' which costs tokens, costs latency, and races against any concurrent human edit elsewhere in the doc (last-write-wins clobbers). Section semantics: the FIRST heading whose plain text matches `heading` exactly (case-sensitive on trimmed text) is found, and everything from that heading up to the next heading at the same OR shallower level is replaced. So a `## Outcomes` section ends at the next `## …` or `# …`; nested `### …` subsections stay part of the replaced range. Returns 404 when no matching heading exists; strict by design so a misremembered heading fails loudly. `markdown` is the FULL replacement, INCLUDING the heading line: pass it back as-is to keep the heading, change it to rename or rewrite the heading, change the heading level, or omit the heading entirely (collapses the section into the prior one). Empty `markdown` deletes the section. Same markdown surface as update_doc / append_doc_section (CommonMark + GFM + `![alt](url)` images + lone-URL videos (mp4/webm/mov/mkv/m4v) + Mermaid + KaTeX + callouts + SVG + details + cross-refs + @-mentions + URL embeds). Identity / attribution / events / doc-guard all flow through the same writeDocBody path as the other doc endpoints, so @-mentions in the new section fire `doc.mention_added` for newly-added mentions just like update_doc does. Requires editor role. Multi-surface workspaces optionally accept `surface_slug` to target a specific doc surface. WARNING — a section runs to the next heading of the SAME OR SHALLOWER level, so targeting the LAST heading (or a lone H1) means its section extends to the END OF THE DOCUMENT and this call replaces everything below it. That has silently destroyed a doc twice (#8196), both times returning success. Call `get_doc` first and check which headings follow the one you are targeting. Agent writes that would drop most of the doc's blocks are now REFUSED with both block counts. So are writes that would delete a heading inside the replaced range (a nested subsection, content below a trailing heading, or the target heading itself when you send only body text), drop a callout / quote / code block / table / image / embed in the range, or most of the section's own blocks; the refusal lists `removedHeadings` and `removedBlocks`. A block counts as carried back when one top-level block of your markdown has exactly its text (whitespace aside), or when you edit it in place (same number of blocks, same type and shape at the same position, and not emptied); rewording a callout into a paragraph, or folding its text into a larger block, counts as removing it. Carry back what you mean to keep, or pass `allowBlockLoss: true` to confirm an intended deletion. Edited or deleted paragraphs and lists are allowed but reported: `replacedSection.removedBlockCount` and `removedBlocks`. CONCURRENCY: concurrent writes to other sections are merged, never overwritten. But if you rebuild a section from an earlier read (someone may have written since), pass the `updatedAt` from your `get_doc` as `if_unmodified_since`, or pass the `sectionHash` from your previous update_doc_section response as `if_section_hash` (guards only this section). Without a precondition the write wins even over an edit you never saw. Every success returns `prior` (the replaced range's `updatedBy`, `updatedAt`, `blockCount`, `contentHash`: who and what you overwrote), `sectionHash` (the section as it now stands, the value for your next `if_section_hash`; null if your markdown left no heading), and the new `updatedAt` to chain into your next `if_unmodified_since`. Heed `warning` (`section_recently_changed_by_other`): your unguarded write landed right after another principal's; `updatedBy` on the doc names only the latest writer, so re-read and restore their edit if your body predates it.
    ConnectorNo auth
  • Post a new comment on any target in a workspace: a row, a cell, a doc text range, an html element, an entire surface, or the workspace itself. Polymorphic target shape mirrors the REST POST /api/workspaces/:slug/comments. For threading, pass `parentId` to hang the new comment as a reply (the server flattens nested replies to single depth and auto-unresolves a resolved parent). Mentions are an array of `{ kind: 'user'|'agent', id, label }` triples; the server validates each mention's access to the workspace before accepting. Fires `comment.added` (and `comment.unresolved` when a reply reopens a resolved parent). For replies to existing comments where you don't want to reconstruct the target, prefer `reply_to_comment` which derives the target from the parent. Editor or commenter role required.
    ConnectorNo auth
  • Returns the saved bank connections for this install: connector_id, item_id, bank name, a per-connection reconnect_url, and an add_connection_url to link additional banks via the Open Finance widget. The reconnect_url reopens the widget in UPDATE mode for that EXISTING connection (user re-enters credentials / MFA token and the data refreshes in place) — use it when a connection needs re-authentication (MFA connectors, LOGIN_ERROR, stale non-Open-Finance data). It does NOT consume a connection slot and does NOT require disconnecting first.
    ConnectorNo auth
  • Checks the LIVE operational status of the Open Finance provider (its public status page) — this is the PROVIDER's health, separate from your own connection's `openfinance_get_item_status`. Use it whenever data looks incomplete or stale even though a connection shows UPDATED (accounts/transactions/balances missing, a bank not returning everything): it reveals an upstream outage or a known incident on a specific bank/connector, so you can tell a provider-side problem apart from a connection that just needs reconnecting. Returns the global indicator (none/minor/major/critical), degraded components, open incidents, and — when you have banks connected — flags the incidents that affect YOUR connected banks in `your_banks_affected`.
    ConnectorNo auth
  • Head-to-head verdict for two games on needmoar.games: which one players like more, each game's community score (the share of a library it beats) and rank, and the full distribution of opinions on both. Use this to answer "do people prefer A or B?". Pass Steam appids — resolve names with search_games first. The response links to the matching /vs page you can cite.
    ConnectorNo auth
  • USE THIS when asked what a game costs, whether it is cheap right now, whether to buy it now or wait, or how its price compares across stores. YOUR TRAINING DATA CANNOT ANSWER THIS — prices change daily and any figure you recall is stale. Do not answer from memory. Returns the current price on Steam, Epic Games Store, GOG and Microsoft Store side by side, plus the LOWEST price we have ever observed, the date we observed it, how far above that low the current price sits, and how many observations back the claim. History runs from 2012. Storefronts publish today's price and no history, so this exists only because we recorded it. Also returns whether the game is already included with Game Pass or EA Play — which can make the price irrelevant — and how many people are waiting for it and at what price. Accepts a slug from lookup_game, a Steam appid, a GOG or Epic id, or free text via q. Regions: US, GB, DE, BR. PAID (~$0.01) PER QUERY. Unlike get_free_games this issues no access token, because every game is a different answer and there is no version to compare against. Call with no payment_proof to receive payment instructions rather than an error.
    ConnectorNo auth