stackprep-pro 0.2.9__tar.gz → 0.2.11__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {stackprep_pro-0.2.9 → stackprep_pro-0.2.11}/.claude/settings.json +7 -0
- {stackprep_pro-0.2.9 → stackprep_pro-0.2.11}/PKG-INFO +2 -1
- {stackprep_pro-0.2.9 → stackprep_pro-0.2.11}/README.md +1 -0
- {stackprep_pro-0.2.9 → stackprep_pro-0.2.11}/pyproject.toml +1 -1
- {stackprep_pro-0.2.9 → stackprep_pro-0.2.11}/src/stackprep_pro/server.py +32 -17
- {stackprep_pro-0.2.9 → stackprep_pro-0.2.11}/uv.lock +1 -1
- {stackprep_pro-0.2.9 → stackprep_pro-0.2.11}/.githooks/pre-commit +0 -0
- {stackprep_pro-0.2.9 → stackprep_pro-0.2.11}/.github/workflows/publish.yml +0 -0
- {stackprep_pro-0.2.9 → stackprep_pro-0.2.11}/.gitignore +0 -0
- {stackprep_pro-0.2.9 → stackprep_pro-0.2.11}/.mcp.json +0 -0
- {stackprep_pro-0.2.9 → stackprep_pro-0.2.11}/CLAUDE.md +0 -0
- {stackprep_pro-0.2.9 → stackprep_pro-0.2.11}/scripts/bump_version.sh +0 -0
- {stackprep_pro-0.2.9 → stackprep_pro-0.2.11}/scripts/generate_readme.py +0 -0
- {stackprep_pro-0.2.9 → stackprep_pro-0.2.11}/src/stackprep_pro/__init__.py +0 -0
- {stackprep_pro-0.2.9 → stackprep_pro-0.2.11}/src/stackprep_pro/skills/certification.md +0 -0
- {stackprep_pro-0.2.9 → stackprep_pro-0.2.11}/src/stackprep_pro/skills/interview.md +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: stackprep-pro
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.11
|
|
4
4
|
Summary: stackprep-pro — interview & certification prep MCP server for any AI client
|
|
5
5
|
Project-URL: Homepage, https://github.com/youngpada1/stackprep-pro
|
|
6
6
|
Project-URL: Repository, https://github.com/youngpada1/stackprep-pro
|
|
@@ -161,6 +161,7 @@ Point this at any Dropbox, Google Drive, or OneDrive folder for cross-platform s
|
|
|
161
161
|
|
|
162
162
|
| Tool | Description | Args |
|
|
163
163
|
|---|---|---|
|
|
164
|
+
| `begin` | Call this at the very start of every conversation. Returns the opening question already formatted | |
|
|
164
165
|
| `start_session` | Start a new stackprep session. Returns a session ID and the skill rules for the AI to follow. | `mode`, `cert_name`, `cv`, `jd`, `extra_topics` |
|
|
165
166
|
| `submit_answer` | Record the result of an answered question. | `session_id`, `result`, `question` |
|
|
166
167
|
| `flag_for_study` | Manually flag the current question for the study pack. | `session_id`, `question` |
|
|
@@ -141,6 +141,7 @@ Point this at any Dropbox, Google Drive, or OneDrive folder for cross-platform s
|
|
|
141
141
|
|
|
142
142
|
| Tool | Description | Args |
|
|
143
143
|
|---|---|---|
|
|
144
|
+
| `begin` | Call this at the very start of every conversation. Returns the opening question already formatted | |
|
|
144
145
|
| `start_session` | Start a new stackprep session. Returns a session ID and the skill rules for the AI to follow. | `mode`, `cert_name`, `cv`, `jd`, `extra_topics` |
|
|
145
146
|
| `submit_answer` | Record the result of an answered question. | `session_id`, `result`, `question` |
|
|
146
147
|
| `flag_for_study` | Manually flag the current question for the study pack. | `session_id`, `question` |
|
|
@@ -12,18 +12,26 @@ from mcp.server.fastmcp import FastMCP
|
|
|
12
12
|
SERVER_INSTRUCTIONS = """\
|
|
13
13
|
stackprep-pro — adaptive interview & certification prep.
|
|
14
14
|
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
tables so each step renders as a polished UI block. NEVER output flat plain text.
|
|
15
|
+
At the very start of every conversation, call the `begin` tool and show its returned markdown to the
|
|
16
|
+
user VERBATIM (it is already formatted as an elegant block — do not rephrase or reformat it).
|
|
18
17
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
2. After they choose, silently check for saved sessions of that mode. If any exist, ask whether they
|
|
22
|
-
want to continue a saved session (list them by the name the user gave them) or start a new one.
|
|
23
|
-
If none exist, just start a new one.
|
|
24
|
-
3. Collect the inputs the skill requires, then call start_session.
|
|
18
|
+
PRESENTATION (every message): always respond as elegant RENDERED markdown blocks — bold headers,
|
|
19
|
+
dividers, clean tables/lists. NEVER output flat plain text.
|
|
25
20
|
|
|
26
|
-
|
|
21
|
+
After the user picks a mode, silently check for saved sessions of that mode; if any exist offer to
|
|
22
|
+
continue one (by the name the user gave it) or start new. Then collect inputs and call start_session.
|
|
23
|
+
Follow the skill rules returned by start_session exactly — the skill is the source of truth."""
|
|
24
|
+
|
|
25
|
+
# Hardcoded so the very first block is guaranteed, not AI-guessed.
|
|
26
|
+
BEGIN_BLOCK = """\
|
|
27
|
+
**What would you like to prep for?**
|
|
28
|
+
|
|
29
|
+
| # | Mode |
|
|
30
|
+
|---|------|
|
|
31
|
+
| 1 | 🎯 Technical Interview |
|
|
32
|
+
| 2 | 📜 Certification Exam |
|
|
33
|
+
|
|
34
|
+
_Reply with 1 or 2._"""
|
|
27
35
|
|
|
28
36
|
mcp = FastMCP("stackprep-pro", instructions=SERVER_INSTRUCTIONS)
|
|
29
37
|
|
|
@@ -85,6 +93,12 @@ def _load_skill(mode: str) -> str:
|
|
|
85
93
|
|
|
86
94
|
# ── Tools ──────────────────────────────────────────────────────────────────────
|
|
87
95
|
|
|
96
|
+
@mcp.tool()
|
|
97
|
+
def begin() -> str:
|
|
98
|
+
"""Call this at the very start of every conversation. Returns the opening question already formatted
|
|
99
|
+
as an elegant markdown block. Show the returned text to the user VERBATIM — do not rephrase or reformat it."""
|
|
100
|
+
return BEGIN_BLOCK
|
|
101
|
+
|
|
88
102
|
@mcp.tool()
|
|
89
103
|
def start_session(
|
|
90
104
|
mode: str,
|
|
@@ -265,7 +279,8 @@ def end_session(session_id: str) -> str:
|
|
|
265
279
|
all_flagged = list(dict.fromkeys(session["auto_flagged"] + session["flagged"]))
|
|
266
280
|
session["ended"] = True
|
|
267
281
|
session["all_flagged"] = all_flagged
|
|
268
|
-
|
|
282
|
+
# Do NOT auto-save the session here. It is only saved if the user explicitly
|
|
283
|
+
# chooses to, via save_session (with a name they provide).
|
|
269
284
|
|
|
270
285
|
score = session["score"]
|
|
271
286
|
topics_list = "\n".join(f" • {t}" for t in all_flagged) if all_flagged else " (none — full score!)"
|
|
@@ -279,13 +294,13 @@ def end_session(session_id: str) -> str:
|
|
|
279
294
|
topics_list,
|
|
280
295
|
"",
|
|
281
296
|
"Now (this flow is identical for interview and certification mode):",
|
|
282
|
-
' 1. Ask the user: "Do you want to save
|
|
283
|
-
" 2. If NO: stop here.
|
|
297
|
+
' 1. Ask the user: "Do you want to save this session? (y/n)"',
|
|
298
|
+
" 2. If NO: stop here. Do NOT save anything — nothing is persisted.",
|
|
284
299
|
" 3. If YES:",
|
|
285
|
-
' a. Ask: "
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
"
|
|
300
|
+
' a. Ask: "What would you like to name this session?" — the user MUST provide a name; never auto-generate one.',
|
|
301
|
+
" b. Call save_session(session_id='{}', session_name=<name the user chose>)".format(session_id),
|
|
302
|
+
' c. Then ask: "Do you want a study pack from this session too? (y/n)" — if yes, generate it and call'
|
|
303
|
+
" save_study_pack(session_id='{}', name=<pack name the user chose>, content=<generated pack>).".format(session_id),
|
|
289
304
|
])
|
|
290
305
|
|
|
291
306
|
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|