PersonalKnowHow

io.github.Georgi-PetkovPublished by GitHub account Georgi-Petkovv1.0.0Updated Nov 2, 2026

Live public demo: query one person's learning and work history as a knowledge graph via MCP.

VerifiedStreamable HTTPWeb executableKnowledge & MemoryAI & ML

Overview

AI-generated overview

Remote MCP server exposing one person's public learning and work history as a queryable knowledge graph of projects, courses, certifications and positions.

What you can do
  • Search a person's skills and experience graph semantically by topic, ranked and capped at 10 results
  • List the complete, uncapped set of entries for one type, such as certifications or courses
  • Find entries related to a given entry by shared tag or content provider, capped at 15 per group
  • Look up every entry carrying an exact tag, grouped by type with real counts
When to use it
Useful when you want to explore or demonstrate how a personal evidence graph can be queried through MCP, or to check what a specific person has actually completed in a given skill area. It is a public demo dataset, not a general-purpose knowledge base.
Requirements
A remote streamable HTTP endpoint; no authentication, environment variables or headers are declared. Only network access to the hosted demo endpoint is needed.
Before you install
The server is unauthenticated and serves a public export of one person's career history, so queries and results are not private. The export deliberately excludes career-interest and job-application signals, so counts are lower than a private tier by design. Semantic search is ranked and capped, so it can miss real matches; exact tag lookups return nothing for untagged skills.

Installation

In SourceWeft

  1. Open PersonalKnowHow in the dashboard and add it to a workspace.
  2. Enable the server for the chats that should use its tools.

Web executable via Streamable HTTP. Remote servers run from the web runtime once configured in a workspace.

Use with an agent

Paste this prompt into Claude Code, Codex, Cursor or another agent — or into SourceWeft chat. The agent reads this server's install guide, shows you its publisher, endpoint and sign-in, and adds it to your client once you agree. Keys never go into a command.

Read https://sourceweft.com/mcp/io.github.Georgi-Petkov%2Fpersonalknowhow/install.md and connect the MCP server it describes to my client. Before changing any config, show me its publisher, endpoint and sign-in method and wait for my OK. Never put an API key in a command or in a file I would commit; ask me where it should come from.

Read the install guide the agent follows

Other MCP clients

Add this to your client's mcpServers config.

{
  "mcpServers": {
    "personalknowhow": {
      "type": "http",
      "url": "https://personalknowhow-demo.kxtwrdzt6g.workers.dev/mcp"
    }
  }
}

README

PersonalKnowHow MCP — public demo

Unauthenticated MCP server over the public export of one person's knowledge graph (public_entries.json + public_embeddings.json, built by ingest/build_public_export.py's fail-closed allowlist). Every entry here represents something actually done or completed (course, project, certification, position, education, etc.) — career-interest/job-application "signal" evidence is structurally excluded from this export, never just filtered at query time.

Tools

query_knowhow(topic: string)

Semantic search, ranked by relevance, capped at 10 results. Not exhaustive — a real match can rank below the cutoff.

query_knowhow({ topic: "django" })→ { "found": true, "count": 4, "evidence": [      { "id": "github_django_docker_db", "label": "django_docker_db", "type": "project", "score": 0.735, ... },      { "id": "github_django_docker", "label": "django_docker", "type": "project", "score": 0.71, ... },      { "id": "github_startup", "label": "StartUp", "type": "project", "score": 0.706, ... },      { "id": "github_news_sentiment_app", "label": "News-sentiment-app", "type": "project", "score": 0.676, ... }   ] }

list_by_type(type: string)

The complete, exact set of entries for one type — no ranking, no cap.

list_by_type({ type: "certification" })→ { "type": "certification", "count": N, "entries": [ { "id": "...", "label": "...", ... }, ... ] }

related_entries(id: string)

Given an entry id, returns other entries sharing at least one tag or the same provider — capped at 15 per group, true count always shown.

related_entries({ id: "github_django_docker" })→ { "id": "github_django_docker", "type": "project",    "related_by_tag": {      "docker": { "count": 4, "entries": [        { "id": "github_django_docker_db", "label": "django_docker_db", "type": "project" }, ... ] },      "aws": { "count": 16, "entries": [ ... ] },      "cloud": { "count": 51, "entries": [ ... ] },      "devops": { "count": 10, "entries": [ ... ] }    },    "related_by_provider": { "count": 36, "entries": [ ... ] } }

(Note: this example shows related_entries only clustering django_docker with the one other Django repo sharing an unrelated tag — neither StartUp nor News-sentiment-app appear, since neither shares a tag with it. skill_evidence({ tag: "docker" }) below finds all of them instead, since it matches on the tag directly rather than requiring a shared-tag path from one specific starting entry.)

skill_evidence(tag: string)

Exact tag match (not semantic), uncapped, grouped by type with real counts. The right tool for "how many X have I actually done" or "do I have any real evidence for X at all."

skill_evidence({ tag: "docker" })→ {    "tag": "docker", "found": true, "count": 5,    "by_type": {      "project": {        "count": 4, "undated_count": 0,        "entries": [          { "id": "github_django_docker", "label": "django_docker", "captured_at": "2021-06-10" },          { "id": "github_django_docker_db", "label": "django_docker_db", "captured_at": "2021-06-22" },          { "id": "github_bedex", "label": "BedEx", "captured_at": "2025-05-29" },          { "id": "github_terraform_associate_prep", "label": "terraform-associate-prep", "captured_at": "2026-08-03" }        ]      },      "endorsement": {        "count": 1, "undated_count": 0,        "entries": [          { "id": "linkedin_endorsements_docker_products_202209", "label": "Endorsed: Docker Products", "captured_at": "2022-09-21" }        ]      }    }  }
skill_evidence({ tag: "gcp" })→ {    "tag": "gcp", "found": true, "count": 2,    "by_type": {      "position": { "count": 1, "undated_count": 0, "entries": [        { "id": "linkedin_positions_data_engineer_data_analyst_at_biites_202107",          "label": "Data Engineer & Data Analyst at Biites", "captured_at": "2021-07-01" } ] },      "project": { "count": 1, "undated_count": 0, "entries": [        { "id": "projects_connector", "label": "connector", "captured_at": "2026-08-09" } ] }    }  }

(The private tier's skill_evidence({ tag: "gcp" }) also surfaces a signal_only career-interest entry — that entire category is excluded from this public export, so this tier's count is lower by design, not by omission.)

An unrecognized tag returns found: false — exact match against tags assigned during ingest, not a fuzzy/semantic lookup. If a skill genuinely exists but was never tagged, query_knowhow may still find it (it searches full entry text, not just tags).

Source: mcp/README.md at commit 68ffd8b

Tools

4

query_knowhow

Query know-how

Search this person's real, grounded skills/experience graph for a topic using semantic search. Returns only entries with real evidence -- never guesses. Every entry here represents something actually done or completed (project, certification, position, course, or education) -- this public dataset never includes saved-but-not-worked jobs or applications. This is SEMANTIC search ranked by relevance and capped at 10 results -- it is NOT exhaustive. For 'list every X' or 'how many X' questions, use list_by_type instead -- it returns the complete, uncapped set with no similarity ranking involved. Clearing the similarity floor means 'closest available match', not 'confirmed match' -- read each result's actual label/description/type before citing it as evidence for the specific topic queried. Each result also carries source_url/captured_at/provider (the real evidence behind it, when available) and source_note (explaining why not, when the underlying source has no link) -- use these to answer a disputed claim with actual backing evidence rather than just the description text. Embeddings can rank a topically-adjacent-but-wrong entry above the floor (e.g. a course on a different cloud data-warehouse tool, or a different framework in the same category) for a term it isn't actually about; if a result isn't genuinely on topic, treat the query as unmatched rather than reporting it as a match. For 'what else is connected to this' or 'what shares a skill/provider with this specific entry' questions, call related_entries with a result's id instead of re-querying by topic.

Parameterstopicrequired

list_by_type

List know-how by type

Returns the COMPLETE, exact set of entries for one type, with no similarity ranking, no relevance cutoff, and no cap on count. Use this instead of query_knowhow whenever the question requires an exhaustive or countable answer ('list all my certifications', 'how many courses have I completed'). Deterministic ordering (sorted by label) -- repeated calls with the same type return the same list in the same order.

Parameterstyperequired

skill_evidence

Find skill evidence

Given an exact tag/skill (e.g. 'docker', 'gcp'), returns EVERY entry with that tag, uncapped, grouped by type with a real count per type. Unlike related_entries (capped at 15, requires a starting entry id) or query_knowhow (semantic, ranked, may over- or under-include), this is an EXACT tag match against every entry -- the right tool for 'how many X have I completed/done' or 'do I have any real evidence for X at all'. Tags are exact strings from a prior list_by_type/related_entries/query_knowhow result's tags array -- this is NOT semantic search; a tag never assigned during ingest returns found:false, try query_knowhow instead. Each type's entries sort by captured_at ascending (oldest first); entries with no captured_at are moved to the end and counted in undated_count, never silently sorted as if their date were known.

Parameterstagrequired

Version history

1
  1. v1.0.0LatestSep 16, 2026

Score

100% of the applicable checks met

How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.

  • Reached in the last 30 daysRequired25 pts
  • Auth declaredRequired10 pts
  • Tools listedRequired15 pts
  • DescriptionRequired15 pts
  • Logo10 pts
  • Documentation15 pts
  • License10 pts