sidelineiq-mcp-servers (kpjmd/sidelineiq-mcp-servers) is an MCP server listed on the M8ven Trust Index. It scores 74 out of 100, grade C. It declares 78 tools. No publisher has claimed this listing.
MCP (Model Context Protocol) servers for the SidelineIQ — an autonomous AI sports injury intelligence platform
Emerging. No concerning findings. Grades remain capped until the project builds reputation through adoption. Grades reflect the full trust pyramid: code, verification depth, and reputation. New projects cap at C until adoption is earned.
How we verified
Verified is a snapshot. Live keeps it current, and builds your track record.
⚡ Connect GitHub → continuous verification on every pushwhy connect →Who stands behind it
kpjmd
Source: github_repo_search
Claim it to get a verified publisher badge, a free copy of our full audit findings, and direct contact for any high-priority issues we find. Or connect your repo for our deepest verification, Live Monitored: read-only, revoke anytime. What we access →
Install from
The grade above is for the source repository. Registries can serve a different version, so we mark the ones we were not able to read.
These names and descriptions are the publisher's own, read from the source code. We print them as written. Our assessment is the findings above, not this list.
farcaster_publish_castPublish a single cast to Farcaster via Neynar API. Use for Breaking injury posts and short Tracking updates under 320 characters.
farcaster_publish_threadPublish a multi-cast thread to Farcaster. Use for Deep Dive injury content requiring more than 320 characters. Automatically chains casts as replies.
farcaster_get_castRetrieve a previously published cast by hash to verify publication status or retrieve content for editing.
farcaster_get_profile_statsRead the SidelineIQ Farcaster account's own follower and following counts via Neynar /user/bulk, for the FID in SIDELINEIQ_FARCASTER_FID. Used by the daily baseline metrics snapshot. Fails with an error rather than returning 0 when the counts cannot be read.
farcaster_get_notificationsFetch recent Farcaster notifications (mentions and replies) for the SidelineIQ account. Filters to mention and reply types only — ignores likes and recasts. Use nextCursor from the response as the cursor on the next call.
farcaster_delete_castDelete a published cast by hash. Use when MD review flags a post for removal after publication.
twitter_publish_tweetPublish a single tweet to X/Twitter. Use for Breaking and Tracking injury posts. Premium account supports up to 25,000 characters per post.
twitter_publish_threadPublish a multi-tweet thread to X/Twitter. Use for Deep Dive and Conflict Flag content. Premium account supports up to 25,000 characters per post. Automatically chains as replies. Maximum 10 tweets per thread.
twitter_get_tweetRetrieve a published tweet by ID to verify publication status.
twitter_get_profile_statsRead the authenticated SidelineIQ X account's own follower, following and post counts (GET /2/users/me). Used by the daily baseline metrics snapshot. Fails with an error rather than returning 0 when the counts cannot be read.
twitter_get_mentionsFetch recent mentions of the SidelineIQ Twitter account. Returns tweets that mention the account since the given since_id cursor. Use newestId from the response as since_id on the next call to avoid reprocessing.
twitter_delete_tweetDelete a published tweet by ID. Use when MD review flags a post for removal after publication.
web_create_injury_postCreate a new injury post in the SidelineIQ database for display on the web frontend. Stores full clinical content, platform publish status, and metadata. Auto-generates a URL slug.
web_update_injury_postUpdate an existing injury post. Used for Tracking updates as the injury story develops and return-to-play estimates are revised.
web_delete_injury_postHard delete an injury post from the SidelineIQ database. NOT the MD reject path — use web_reject_injury_post, which keeps the row so the review queue remembers the decision. This is for genuine deletions only. Protected against accidentally deleting posts with TRACKING children — pass force:true to …
web_reject_injury_postReject a post awaiting MD review: sets status REJECTED, keeps the row, and closes its md_reviews entry. Replaces web_delete_injury_post on the reject path — the row is what lets the agent remember the decision and stop re-filing the same review item every poll cycle. Void the post's thread BEFORE ca…
web_supersede_injury_postRetire pending review items that a later post has already published for, so the MD cannot approve a duplicate. Only rows currently in PENDING_REVIEW are touched; anything else is returned in `skipped`. The caller decides equivalence — this tool takes explicit ids.
web_get_postRetrieve an existing injury post by ID.
web_get_post_by_slugRetrieve an injury post by its URL slug. Used by the frontend for slug-based routing.
web_get_post_by_social_idLook up an OTM injury post by its Twitter ID or Farcaster hash — use this to retrieve the original post content when responding to mentions.
web_flag_for_md_reviewFlag an injury post for MD review. By default sets post status to PENDING_REVIEW (correct for new agent-generated content that hasn't published yet). Pass preserve_status=true for retrospective flags on already-PUBLISHED posts (legacy fact sweep, post-hoc audits) so the live post isn't pulled out of…
web_list_postsList injury posts with filtering. Used by the agent to check for duplicate coverage before publishing.
web_list_md_reviewsList MD review records for the admin dashboard, joined with injury post details. Optionally filter by review status.
web_update_md_reviewApprove or reject an MD review. If approved, also sets the linked injury post status to PUBLISHED. Sets reviewed_at timestamp.
web_purge_all_postsPurge ALL injury posts and their cascaded md_reviews from the database. One-time pre-launch operation. Requires confirm:true. Returns row counts before and after.
web_get_social_stateRead a value from the social monitor state table. Used to retrieve pagination cursors (twitter_mentions_since_id, farcaster_notifications_cursor) between polling cycles.
web_set_social_stateUpsert a value in the social monitor state table. Used to persist pagination cursors between polling cycles.
web_record_metric_snapshotRecord one baseline metric reading (follower count, monthly uniques) for a UTC day. Upserts on (metric, day): the latest reading of a day wins. Call ONLY with a value actually read — a failed read must record nothing, never 0.
web_list_metric_snapshotsList baseline metric readings, ordered by metric then day. A day with no row means no reading was taken or the read failed — never zero.
web_increment_cta_clickCount one click on an AequOs link from a post page. Aggregate only — stores the day, post slug and which link, nothing about the visitor. Counts only when the slug belongs to a PUBLISHED post; returns counted=false otherwise.
web_list_cta_clicksList daily AequOs link click counts from post pages, with totals by link and by post.
web_check_mention_processedCheck whether a social mention has already been processed. Returns processed:true if a matching row exists in processed_mentions.
web_insert_processed_mentionLog a processed mention to the processed_mentions table. Call this after every mention regardless of action taken (REPLIED, IGNORED, QUEUED_CORRECTION). Silently ignores duplicates.
web_insert_pending_correctionQueue a user-submitted correction for admin review. Called when a mention is classified as CORRECTION with confidence > 0.8. Corrections do NOT auto-update posts.
web_list_pending_correctionsList pending corrections submitted by users. Used by the admin dashboard to review and approve/dismiss factual corrections to OTM posts.
web_approve_injury_postOne-click approve a PENDING_REVIEW injury post. Flips status to PUBLISHED and marks the linked md_reviews row as APPROVED. Returns the full post row for downstream social publishing (Farcaster, Twitter). No reviewer notes required — for richer reviews with notes, use web_update_md_review.
web_upsert_teamUpsert a team row from ESPN's teams endpoint. Conflict resolution: (sport, espn_team_id) when the ESPN id is present, else (sport, name) case- and whitespace-insensitively among rows that have no ESPN id. Used by the roster-sync cycle that runs every 6h to keep teams current with trades and rebrands…
web_upsert_playerUpsert a player row from ESPN's roster endpoints (or the athlete-tier override list). Conflict resolution: (sport, espn_athlete_id) when ESPN id present, else (sport, normalized_name). The server canonicalizes full_name into normalized_name (lowercase, no diacritics, Jr/Sr stripped) to make later re…
web_set_player_prominenceOverride the prominence_tier for a specific player. Used by the athlete-tier override import and any future manual prominence adjustments. prominence_source signals where the value came from for auditability ('override' for the JSON file, 'manual' for dashboard edits).
web_resolve_playerResolve an athlete name to a canonical player record (with current team). Pass espn_athlete_id when the source carries one — it is tried first and returns confidence='exact', which is the only way to separate two athletes who share a name. Returns confidence='normalized' on a unique name match, 'amb…
web_list_teamsList team rows, optionally filtered by sport and by coverage state. coverage='in' (default) returns clubs inside our editorial coverage, 'out' returns clubs that still exist upstream but have left it (e.g. relegated), 'all' returns both. Used by roster-sync drift detection and the seasonal coverage-…
web_list_playersList player rows with their ESPN athlete ids and contract salary, optionally filtered by sport, team, and the coverage state of their current team. Unlike web_resolve_player this does not hide players on out-of-coverage clubs — it is the inspection surface for roster repair, not a publish-path looku…
web_set_team_coverageMark a team as inside or outside our editorial coverage. Out-of-coverage clubs keep their row and their player links — the club still exists (e.g. relegated to a league we do not poll) — but its players stop resolving via web_resolve_player. Reversible: in_coverage=true restores it, and a club reapp…
web_apply_correctionApply a fact correction to a published injury post. Field must be one of: team, injury_type, injury_severity, team_timeline_weeks. Appends a visible 'Updated on <date>: <note>' line to clinical_summary and bumps correction_count — never a silent overwrite. Caller should follow up with web_append_inj…
web_get_entity_for_postLook up the injury entity associated with a post — either as the canonical_post_id or via an injury_updates link. Used by the entity backfill script to walk parent_post_id chains and reuse existing entities.
web_get_entityResolve an injury entity by id (player_id, body_part, laterality, injury_type, status, canonical_post_id, return date). Lets the Injury Desk walk a desk post's entity_id → canonical_post_id → web_get_post for fact-validation context.
web_get_published_desk_post_for_entityLook up the most recent PUBLISHED desk post for an injury entity, or null if the entity has none. Used to detect whether new injury_updates activity on an entity should surface as a Return Watch candidate (append to the existing post) instead of a new-post candidate.
web_list_injury_updatesList an injury entity's timeline updates newest-first (update_kind, severity_at_time, team_timeline_weeks, otm_min_weeks, source_url, description). Backs the Injury Desk entity-timeline panel. An empty array is a valid result, not an error.
web_find_matching_entityFind an active injury entity matching player + body part + laterality + injury type within a recency window. Returns the most recent matching entity (with last update's severity + team_timeline_weeks for delta-decision purposes) or matched=false if nothing matches.
web_create_injury_entityCreate a new injury entity. Called once per real-world injury — subsequent updates use web_append_injury_update. canonical_post_id should point to the originating BREAKING/DEEP_DIVE post when one exists.
web_append_injury_updateAppend an update to an injury entity's timeline. post_id is nullable (repeat source reports about the same injury append updates without producing a new post). Bumps the entity's last_updated_at so future recency-window matches stay current.
web_thread_update_datesPersist resolved injury/surgery dates and provenance onto an injury thread (the injury_entities row). Called by the pre-OTM date-resolution loop, the post-publish projection patch, and MD manual date entry. Every field is optional and COALESCE'd against the current value — omit a field to leave it u…
web_thread_append_timelineAppend a trajectory data-point to a thread before the post is drafted: the reported team timeline, OTM min weeks, severity, and source. Thin wrapper over injury_updates (reported_timeline_weeks maps to team_timeline_weeks); post_id is attached later by entity bookkeeping. Use update_kind INITIAL for…
web_thread_closeClose an injury thread when the athlete returns (RESOLVED) or retires (RETIRED), or retract one that should never have existed (VOID). RESOLVED/RETIRED record actual_return_date and compute accuracy_record against the stored otm_projection. VOID does neither — it means the thread describes an injury…
web_thread_correct_lateralityCorrect the stored laterality (side) on an injury thread. Use when a thread was opened with the wrong side and the posts have already been corrected — the entity's laterality feeds every follow-up's thread context and is half the (player_id, body_part, laterality) dedup key, so leaving it wrong keep…
web_thread_getReturn one injury thread in a single round-trip for the MD detail view: the entity row (resolved dates, OTM projection, accuracy record) plus its full injury_updates trajectory newest-first.
web_list_threadsList injury threads for the MD dashboard, joined with athlete name / sport / team. Filter by status (ACTIVE/RESOLVED/RETIRED/VOID) and/or needs_date_review to drive the active, date-review, and accuracy views. Ordered by last_updated_at, newest first, with id as the tiebreak. Paged: follow next_offs…
web_audit_appendAppend an immutable audit entry. Used at every pipeline stage (ingest, validate, draft, attest, publish, correct, retract). before/after payloads are hashed server-side using canonical-JSON SHA-256.
web_list_audit_entriesList audit entries for one entity in reverse-chronological order. Use to reconstruct the history of a post, desk piece, or entity for review/defensibility.
web_propose_candidatePropose (or refresh) an Injury Desk promotion candidate for an injury entity. Upserts the single open PROPOSED candidate per entity — re-proposing updates the score/reasons in place rather than creating a duplicate. Does NOT publish anything; it queues the entity for MD triage. promotion_score is 0-…
web_list_candidatesList Injury Desk promotion candidates, joined to athlete/entity/post display fields, ordered by promotion_score. Filter by status (PROPOSED for the open queue). Use to render the Candidates tab in /admin.
web_decide_candidateRecord an MD decision on a promotion candidate: ACCEPTED (park for Injury Desk authoring) or DISMISSED (close). Only PROPOSED candidates can be decided. Audited. decided_by should be the MD user id.
web_get_userLook up a verified user (identity + role) by id. The Tier 2 publish gate uses this to re-derive role from the database rather than trusting a caller-supplied role. Returns null if not found.
web_get_user_by_emailLook up a verified user by email (case-insensitive). Used by the NextAuth adapter to resolve the signing-in identity and its role. Returns null if not found.
web_upsert_userProvision or update a verified user identity (role md|editor). Idempotent on email. Audited. Administrative provisioning only — the magic-link flow does not mint users.
web_create_verification_tokenPersist an Auth.js magic-link verification token (issued at link-request time). identifier is the recipient email; expires is an ISO 8601 timestamp.
web_use_verification_tokenAtomically consume a magic-link verification token at click time (single-use, delete-on-read). Returns the token row if valid, or null if already used / never existed.
desk_create_draftCreate a DRAFT Injury Desk (Tier 2) post from an ACCEPTED promotion candidate. Writes the v1 version row and moves the candidate to PROMOTED. Does NOT publish — a desk post must be attested by an MD and pass the server-enforced publish gate first.
desk_update_draftSave edits to a DRAFT or READY desk post. Writes a new version row on every save. Editing a READY (attested) post reverts it to DRAFT — the prior attestation is now stale and must be redone before publishing.
desk_lintLint a desk post for Tier 2 framing violations and kpjmd contract compliance. Returns {warnings, blockers}; non-empty blockers will block desk_publish.
desk_attestRecord a physician attestation on a desk post. The MD role is re-derived server-side from reviewer_user_id (a UUID = session.user.id) — a caller-supplied role is ignored. All three confirmations must be true. Snapshots the current body's content_hash and moves the post to READY.
desk_publishRun the server-enforced publish gate on a READY desk post. Publishes only if ALL hold: the DB-derived role of reviewer_user_id is 'md', the latest attestation's content_hash equals the post's current body hash (catches post-attestation edits), and the linter returns zero blockers. A blocked publish …
desk_retractRetract a PUBLISHED desk post (status → RETRACTED). MD-only — role is re-derived from reviewer_user_id. Refreshes draft_json so _sideline.status becomes RETRACTED; the frontend serves that snapshot as {slug}.retracted.json, which the kpjmd builder renders as a tombstone page at the same URL.
desk_confirm_kpjmd_liveVerify a PUBLISHED desk post is actually live on kpjmd.com and record the confirmation. Fetches https://kpjmd.com/injury-desk/{slug}/ and requires BOTH a 200 and an x-sideline-content-hash meta tag matching the post's current content_hash (so a stale page from an earlier build cannot pass). Only on …
desk_append_updateAppend a dated 'Return Watch' follow-up to an already-PUBLISHED Injury Desk post (e.g. a return-to-play milestone). MD-only — role re-derived from author_id. Refreshes the post's draft_json (kpjmd handoff snapshot) to include the new update. If candidate_id is supplied, that RETURN_WATCH_UPDATE cand…
desk_list_updatesList a desk post's Return Watch updates newest-first (headline, markdown_body, occurred_at, author_id). Backs the timeline rendered in the /desk editor and the updates[] array of the kpjmd handoff. Empty array is a valid result.
desk_listList Injury Desk posts (optionally filtered by status), newest-updated first, joined to athlete/injury display fields.
desk_getFetch one desk post by id plus its attestations (newest first) for the Injury Desk editor view.
Disclosed vulnerabilities in this server's declared npm dependencies (via OSV). Whether each is reachable depends on the installed versions.
When Vitest UI server is listening, arbitrary file can be read and executed
Claude SDK for TypeScript has Insecure Default File Permissions in Local Filesystem Memory Tool
Claude SDK for TypeScript: Memory Tool Path Validation Allows Sandbox Escape to Sibling Directories
Vitest: Path Traversal / Arbitrary File Read via @vitest/mocker Redirect Mock
MCP_AUTH_SECRETPORT_FARCASTERFarcaster server port (default: 3101)PORT_TWITTERTwitter server port (default: 3102)PORT_WEBWeb server port (default: 3103)DATABASE_URLTool inputs are validated
75/78 tool handlers declare input schemas (96%)
Declare an inputSchema with zod/joi/yup on every tool definition.
Production dependencies are patched
1 medium severity in production deps
Run npm audit fix, or upgrade the affected packages to a non-vulnerable version.
Dev dependencies
1 critical/high in dev-only deps (does not ship to users)
Upgrade dev dependencies when convenient.
Claim the listing to review these findings one by one and send us a correction where you disagree, straight to the team. Claiming also means we tell you when the grade moves, and reach you first if we find anything urgent.
[](https://m8ven.ai/mcp/kpjmd/sidelineiq-mcp-servers)?variant=verified to the badge URL.Vetting this one by hand? Tool Check is an MCP that scores other MCPs. Add it once and ask Claude, ChatGPT, or any MCP client to grade a server, surface CVEs, check the publisher, and suggest safer alternatives — before you install.
https://m8ven.ai/api/mcp/tool-check