create-academic-research 0.1.5 → 0.1.6
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.
- package/README.md +42 -9
- package/dist/src/capabilities.js +62 -4
- package/dist/src/cli.js +47 -12
- package/dist/src/project.js +2 -1
- package/dist/src/prompts.js +2 -1
- package/dist/src/stack.d.ts +8 -0
- package/dist/src/stack.js +127 -73
- package/package.json +1 -1
- package/template/README.md +13 -7
- package/template/package.json +2 -1
package/README.md
CHANGED
|
@@ -46,10 +46,12 @@ By default, the wizard:
|
|
|
46
46
|
|
|
47
47
|
- creates the repository structure;
|
|
48
48
|
- installs the project-local `VincenzoImp/academic-research-skills` package;
|
|
49
|
-
- enables the
|
|
50
|
-
|
|
49
|
+
- enables only the low-friction `arxiv` MCP record;
|
|
50
|
+
- documents the wider MCP catalog, including Semantic Scholar, OpenAlex, DBLP,
|
|
51
|
+
PubMed, Zotero, Crossref, Overleaf, and fallback aggregators;
|
|
51
52
|
- writes `configs/capabilities.yaml`;
|
|
52
53
|
- writes `docs/agent/capability-profile.md`;
|
|
54
|
+
- writes `docs/agent/mcp-setup.md`;
|
|
53
55
|
- writes `docs/agent/generated/mcp.json` unless an explicit agent target is set;
|
|
54
56
|
- appends the onboarding event to `wiki/log.md`;
|
|
55
57
|
- does not install external MCP tools unless explicitly requested.
|
|
@@ -58,6 +60,12 @@ Use `--preset enhanced` when you also want the curated complementary external
|
|
|
58
60
|
skill bundles for agent engineering, frontend work, testing, document formats,
|
|
59
61
|
and PDF conversion.
|
|
60
62
|
|
|
63
|
+
Research-specific skills are intentionally not pulled from external packages by
|
|
64
|
+
default. The academic research workflow, literature review, citation audit,
|
|
65
|
+
paper writing, peer review, rebuttal, and reproduction policies come from
|
|
66
|
+
`VincenzoImp/academic-research-skills`. External skills installed by the wizard
|
|
67
|
+
are complementary tooling only.
|
|
68
|
+
|
|
61
69
|
## Non-Interactive Create
|
|
62
70
|
|
|
63
71
|
```bash
|
|
@@ -90,6 +98,7 @@ npx academic-research mcp list
|
|
|
90
98
|
npx academic-research mcp enabled
|
|
91
99
|
npx academic-research mcp available
|
|
92
100
|
npx academic-research mcp commands arxiv
|
|
101
|
+
npx academic-research mcp env openalex semantic-scholar zotero
|
|
93
102
|
npx academic-research mcp enable arxiv openalex
|
|
94
103
|
npx academic-research mcp disable arxiv
|
|
95
104
|
npx academic-research mcp install arxiv
|
|
@@ -118,11 +127,12 @@ MCP commands are split by side-effect:
|
|
|
118
127
|
| `mcp enabled` | List only enabled MCP server ids. |
|
|
119
128
|
| `mcp available` | List the local MCP catalog. |
|
|
120
129
|
| `mcp commands` | Print finite external install commands without running them. Runtime-only `uvx`/`npx` servers may have no install command. |
|
|
130
|
+
| `mcp env` | Print required/recommended env vars, hosted endpoints, local prerequisites, and setup commands for selected servers. |
|
|
121
131
|
| `mcp enable` | Enable an MCP server in project records and generated snippets. |
|
|
122
132
|
| `mcp disable` | Remove an MCP server from project records and generated snippets. |
|
|
123
133
|
| `mcp install` | Run finite external tool install commands for selected MCP servers. It must not launch stdio MCP servers. |
|
|
124
134
|
| `mcp uninstall` | Run the external uninstall command when one exists. |
|
|
125
|
-
| `mcp doctor` | Validate enabled MCP records and
|
|
135
|
+
| `mcp doctor` | Validate enabled MCP records, generated snippets, required env vars, and documented manual prerequisites. |
|
|
126
136
|
|
|
127
137
|
## Companion Skills
|
|
128
138
|
|
|
@@ -147,11 +157,34 @@ Preset intent:
|
|
|
147
157
|
| Preset | Intent |
|
|
148
158
|
|---|---|
|
|
149
159
|
| `minimal` | Academic research skills only, no MCP records. |
|
|
150
|
-
| `default` | Academic research skills plus
|
|
160
|
+
| `default` | Academic research skills plus the low-friction arXiv MCP record. |
|
|
151
161
|
| `enhanced` | `default` plus curated external complementary skill bundles. |
|
|
152
|
-
| `literature` | SOTA and systematic-review work with
|
|
153
|
-
| `writing` | Paper-writing
|
|
154
|
-
| `full` | Broad
|
|
162
|
+
| `literature` | SOTA and systematic-review work with arXiv plus DBLP for computer science bibliography. |
|
|
163
|
+
| `writing` | Paper-writing work; Overleaf is documented as an opt-in credentialed integration. |
|
|
164
|
+
| `full` | Broad setup with low-friction arXiv and DBLP records plus the full optional MCP catalog documented. |
|
|
165
|
+
|
|
166
|
+
MCP defaults are intentionally conservative. Semantic Scholar, OpenAlex,
|
|
167
|
+
Zotero, Overleaf, Crossref, and fallback aggregators are useful, but they need
|
|
168
|
+
API keys, local apps, manual setup, or source-policy review. Enable them with
|
|
169
|
+
`npx academic-research mcp enable <server>` after reading
|
|
170
|
+
`docs/agent/mcp-setup.md`, use `npx academic-research mcp env <server>` to see
|
|
171
|
+
runtime prerequisites, then run `npx academic-research mcp doctor`.
|
|
172
|
+
|
|
173
|
+
The MCP catalog distinguishes local runtime adapters from hosted endpoints and
|
|
174
|
+
manual integrations. arXiv and DBLP are low-friction local `uvx` runtimes.
|
|
175
|
+
Semantic Scholar is useful for citation graphs but works best with
|
|
176
|
+
`SEMANTIC_SCHOLAR_API_KEY`. OpenAlex requires `OPENALEX_API_KEY` for the
|
|
177
|
+
selected local adapter; OpenAlex keys are free for normal academic use with
|
|
178
|
+
daily free usage. PubMed is a biomedical-specific `npx` runtime and remains
|
|
179
|
+
opt-in. Zotero needs the local Zotero desktop app and Zoty setup. Overleaf is
|
|
180
|
+
manual and credentialed. Crossref and broad paper-search aggregators are kept
|
|
181
|
+
as fallback/manual entries until a project explicitly needs them.
|
|
182
|
+
|
|
183
|
+
Generated MCP snippets are project documentation and client-ready config, not
|
|
184
|
+
live tools by themselves. Your MCP client must load the generated snippet, and
|
|
185
|
+
the referenced commands must be available on your machine or runnable through
|
|
186
|
+
`uvx`/`npx`. `mcp install` only runs finite setup commands such as the arXiv
|
|
187
|
+
tool install; it deliberately does not launch stdio MCP servers.
|
|
155
188
|
|
|
156
189
|
## Validate This Package
|
|
157
190
|
|
|
@@ -169,8 +202,8 @@ Releases are tag-driven. Update `package.json` and `package-lock.json`, commit
|
|
|
169
202
|
the change, create `vX.Y.Z`, and push the tag:
|
|
170
203
|
|
|
171
204
|
```bash
|
|
172
|
-
git tag -a v0.1.
|
|
173
|
-
git push origin main v0.1.
|
|
205
|
+
git tag -a v0.1.6 -m "v0.1.6"
|
|
206
|
+
git push origin main v0.1.6
|
|
174
207
|
```
|
|
175
208
|
|
|
176
209
|
Once the GitHub repository is public, the release workflow validates the tag
|
package/dist/src/capabilities.js
CHANGED
|
@@ -25,6 +25,7 @@ export async function writeCapabilities(root, state) {
|
|
|
25
25
|
};
|
|
26
26
|
await writeFile(join(root, "configs/capabilities.yaml"), YAML.stringify(next), "utf8");
|
|
27
27
|
await writeCapabilityProfile(root, next);
|
|
28
|
+
await writeMcpSetup(root, next);
|
|
28
29
|
await writeMcpSnippet(root, next);
|
|
29
30
|
await appendCapabilityLog(root, next);
|
|
30
31
|
}
|
|
@@ -233,6 +234,19 @@ export async function doctorMcpServers(root) {
|
|
|
233
234
|
const server = AGENT_STACK.mcp_servers[name];
|
|
234
235
|
if (!server)
|
|
235
236
|
continue;
|
|
237
|
+
for (const envName of server.required_env) {
|
|
238
|
+
if (!process.env[envName]) {
|
|
239
|
+
errors.push(`${name}: missing required environment variable: ${envName}`);
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
for (const envName of server.recommended_env) {
|
|
243
|
+
if (!process.env[envName]) {
|
|
244
|
+
warnings.push(`${name}: recommended environment variable not set: ${envName}`);
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
if (server.local_service) {
|
|
248
|
+
warnings.push(`${name}: requires local service: ${server.local_service}`);
|
|
249
|
+
}
|
|
236
250
|
if (!server.command) {
|
|
237
251
|
warnings.push(`${name}: manual setup only; no generated client command`);
|
|
238
252
|
continue;
|
|
@@ -240,9 +254,6 @@ export async function doctorMcpServers(root) {
|
|
|
240
254
|
if (!generatedServers.has(name)) {
|
|
241
255
|
errors.push(`${name}: enabled but missing from generated MCP snippet`);
|
|
242
256
|
}
|
|
243
|
-
if (!server.install_command) {
|
|
244
|
-
warnings.push(`${name}: no automated install command is defined`);
|
|
245
|
-
}
|
|
246
257
|
}
|
|
247
258
|
return { ok: errors.length === 0, errors, warnings, enabled };
|
|
248
259
|
}
|
|
@@ -290,13 +301,46 @@ async function writeCapabilityProfile(root, state) {
|
|
|
290
301
|
else {
|
|
291
302
|
for (const name of state.mcp_servers) {
|
|
292
303
|
const server = AGENT_STACK.mcp_servers[name];
|
|
293
|
-
const status = server?.command ?
|
|
304
|
+
const status = server?.command ? server.execution_mode : "manual setup";
|
|
294
305
|
lines.push(`- \`${name}\` (${status}): ${server?.smoke_test ?? "Smoke-test before use."}`);
|
|
295
306
|
}
|
|
296
307
|
}
|
|
297
308
|
lines.push("", "## Rules", "", "- Skill installation is project-local by default.", "- Agent target `universal` installs one shared project-local `.agents/skills` copy.", "- MCP enable/disable changes project records; install/uninstall changes external tools.", "- Keep API keys, tokens, cookies, and browser sessions out of git.", "- Cite repository source records, not raw MCP output alone.", "");
|
|
298
309
|
await writeFile(join(root, "docs/agent/capability-profile.md"), lines.join("\n"), "utf8");
|
|
299
310
|
}
|
|
311
|
+
async function writeMcpSetup(root, state) {
|
|
312
|
+
const enabled = new Set(state.mcp_servers ?? []);
|
|
313
|
+
const lines = [
|
|
314
|
+
"# MCP Setup",
|
|
315
|
+
"",
|
|
316
|
+
"This file is generated from the project-local academic research capability stack.",
|
|
317
|
+
"MCP records are configuration snippets and setup guidance; the active MCP client must load the generated snippet before these servers become live tools.",
|
|
318
|
+
"",
|
|
319
|
+
"## Enabled MCP Servers",
|
|
320
|
+
""
|
|
321
|
+
];
|
|
322
|
+
if (enabled.size === 0) {
|
|
323
|
+
lines.push("- None.");
|
|
324
|
+
}
|
|
325
|
+
else {
|
|
326
|
+
for (const name of state.mcp_servers) {
|
|
327
|
+
const server = AGENT_STACK.mcp_servers[name];
|
|
328
|
+
if (!server)
|
|
329
|
+
continue;
|
|
330
|
+
lines.push(`- \`${name}\` (${server.readiness}, ${server.priority}): ${server.source_need}`, ` - Source: \`${server.source}\``, ` - Execution mode: \`${server.execution_mode}\``, ...(server.hosted_url ? [` - Hosted endpoint: <${server.hosted_url}>`] : []), ` - Runtime: ${formatRuntime(server.command, server.args)}`, ` - Install command: ${server.install_command ? `\`${server.install_command}\`` : "none; runtime-only or manual setup"}`, ...server.setup_commands.map((command) => ` - Setup command: \`${command}\``), ` - Smoke test: ${server.smoke_test}`, ` - Risks: ${server.risks}`);
|
|
331
|
+
appendMcpPrerequisiteLines(lines, server.required_env, server.recommended_env, server.local_service);
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
lines.push("", "## Available MCP Catalog", "");
|
|
335
|
+
for (const [name, server] of Object.entries(AGENT_STACK.mcp_servers)) {
|
|
336
|
+
const status = enabled.has(name) ? "enabled" : "available";
|
|
337
|
+
lines.push(`- \`${name}\` (${status}, ${server.readiness}, ${server.priority}): ${server.source_need}`, ` - Source: \`${server.source}\``, ` - Execution mode: \`${server.execution_mode}\``, ...(server.hosted_url ? [` - Hosted endpoint: <${server.hosted_url}>`] : []), ...server.setup_commands.map((command) => ` - Setup command: \`${command}\``));
|
|
338
|
+
appendMcpPrerequisiteLines(lines, server.required_env, server.recommended_env, server.local_service);
|
|
339
|
+
}
|
|
340
|
+
lines.push("", "## Operating Rules", "", "- Keep secrets in your shell, MCP client secret store, or local untracked files; do not commit tokens or API keys.", "- Prefer the smallest enabled MCP set that covers the current research question.", "- Treat MCP output as retrieval metadata. Promote claims into repository source records only after source ingestion and citation audit.", "- Run `npx academic-research mcp doctor` after changing MCP records or environment variables.", "");
|
|
341
|
+
await mkdir(join(root, "docs/agent"), { recursive: true });
|
|
342
|
+
await writeFile(join(root, "docs/agent/mcp-setup.md"), lines.join("\n"), "utf8");
|
|
343
|
+
}
|
|
300
344
|
async function appendCapabilityLog(root, state) {
|
|
301
345
|
const logPath = join(root, "wiki/log.md");
|
|
302
346
|
const date = new Date().toISOString().slice(0, 10);
|
|
@@ -311,6 +355,20 @@ function renderSkillCommand(command, agent) {
|
|
|
311
355
|
const agentFlag = normalized === AUTO_AGENT ? "" : `--agent '${normalized}'`;
|
|
312
356
|
return command.replaceAll("{agent_flag}", agentFlag).replaceAll("{agent}", normalized);
|
|
313
357
|
}
|
|
358
|
+
function appendMcpPrerequisiteLines(lines, requiredEnv, recommendedEnv, localService) {
|
|
359
|
+
if (requiredEnv.length > 0)
|
|
360
|
+
lines.push(` - Requires env: ${requiredEnv.map((name) => `\`${name}\``).join(", ")}`);
|
|
361
|
+
if (recommendedEnv.length > 0) {
|
|
362
|
+
lines.push(` - Recommended env: ${recommendedEnv.map((name) => `\`${name}\``).join(", ")}`);
|
|
363
|
+
}
|
|
364
|
+
if (localService)
|
|
365
|
+
lines.push(` - Local prerequisite: ${localService}`);
|
|
366
|
+
}
|
|
367
|
+
function formatRuntime(command, args) {
|
|
368
|
+
if (!command)
|
|
369
|
+
return "manual setup";
|
|
370
|
+
return `\`${[command, ...args].join(" ")}\``;
|
|
371
|
+
}
|
|
314
372
|
async function readCapabilitiesFile(root) {
|
|
315
373
|
const path = join(root, "configs/capabilities.yaml");
|
|
316
374
|
return normalizeCapabilityState(YAML.parse(await readFile(path, "utf8")));
|
package/dist/src/cli.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { readFileSync } from "node:fs";
|
|
2
2
|
import { basename, dirname, join, resolve } from "node:path";
|
|
3
3
|
import { fileURLToPath } from "node:url";
|
|
4
|
-
import { disableMcpServers, doctorMcpServers, enableMcpServers, DEFAULT_AGENT, installMcpTools, installSkills, listInstalledSkills, mcpToolCommandTexts, readCapabilities, removeSkills, uninstallMcpTools, updateSkills } from "./capabilities.js";
|
|
4
|
+
import { assertKnownMcpServers, disableMcpServers, doctorMcpServers, enableMcpServers, DEFAULT_AGENT, installMcpTools, installSkills, listInstalledSkills, mcpToolCommandTexts, readCapabilities, removeSkills, uninstallMcpTools, updateSkills } from "./capabilities.js";
|
|
5
5
|
import { createProject, doctorProject, renameProject } from "./project.js";
|
|
6
6
|
import { askCreateOptions } from "./prompts.js";
|
|
7
7
|
import { AGENT_STACK, presetMcpServers } from "./stack.js";
|
|
@@ -244,10 +244,10 @@ async function mcpCommand(argv) {
|
|
|
244
244
|
assertNoArguments(parsed.positionals, "mcp list");
|
|
245
245
|
const state = await readCapabilities(root);
|
|
246
246
|
const enabled = new Set(state.mcp_servers ?? []);
|
|
247
|
+
console.log("status\tid\treadiness\texecution_mode\tdescription");
|
|
247
248
|
for (const [name, server] of Object.entries(AGENT_STACK.mcp_servers)) {
|
|
248
249
|
const status = enabled.has(name) ? "enabled" : "available";
|
|
249
|
-
|
|
250
|
-
console.log(`${status}\t${name}\t${server.source_need}\t${installer}`);
|
|
250
|
+
console.log(`${status}\t${name}\t${server.readiness}\t${server.execution_mode}\t${server.source_need}`);
|
|
251
251
|
}
|
|
252
252
|
return 0;
|
|
253
253
|
}
|
|
@@ -263,9 +263,9 @@ async function mcpCommand(argv) {
|
|
|
263
263
|
if (subcommand === "available") {
|
|
264
264
|
assertOnlyOptions(parsed.flags, "mcp available", []);
|
|
265
265
|
assertNoArguments(parsed.positionals, "mcp available");
|
|
266
|
+
console.log("id\treadiness\texecution_mode\tdescription");
|
|
266
267
|
for (const [name, server] of Object.entries(AGENT_STACK.mcp_servers)) {
|
|
267
|
-
|
|
268
|
-
console.log(`${name}\t${server.source_need}\t${installer}`);
|
|
268
|
+
console.log(`${name}\t${server.readiness}\t${server.execution_mode}\t${server.source_need}`);
|
|
269
269
|
}
|
|
270
270
|
return 0;
|
|
271
271
|
}
|
|
@@ -278,6 +278,15 @@ async function mcpCommand(argv) {
|
|
|
278
278
|
console.log(command);
|
|
279
279
|
return 0;
|
|
280
280
|
}
|
|
281
|
+
if (subcommand === "env") {
|
|
282
|
+
assertOnlyOptions(parsed.flags, "mcp env", ["root"]);
|
|
283
|
+
const root = resolve(flagString(parsed.flags, "root") ?? ".");
|
|
284
|
+
const selected = parsed.positionals.length > 0 ? parsed.positionals : (await readCapabilities(root)).mcp_servers;
|
|
285
|
+
assertKnownMcpServers(selected);
|
|
286
|
+
console.log("id\ttype\tvalue");
|
|
287
|
+
printMcpEnvironment(selected);
|
|
288
|
+
return 0;
|
|
289
|
+
}
|
|
281
290
|
if (subcommand === "enable") {
|
|
282
291
|
assertOnlyOptions(parsed.flags, "mcp enable", ["root", "agent"]);
|
|
283
292
|
const root = resolve(flagString(parsed.flags, "root") ?? ".");
|
|
@@ -405,11 +414,6 @@ function assertOnlyOptions(flags, command, allowedOptions) {
|
|
|
405
414
|
throw new Error(`${command} does not accept ${unexpected.map((name) => `--${name}`).join(", ")}`);
|
|
406
415
|
}
|
|
407
416
|
}
|
|
408
|
-
function mcpInstallMode(installCommand, runtimeCommand) {
|
|
409
|
-
if (installCommand)
|
|
410
|
-
return installCommand;
|
|
411
|
-
return runtimeCommand ? "runtime-only" : "manual";
|
|
412
|
-
}
|
|
413
417
|
export function formatInteractiveCreateGuide() {
|
|
414
418
|
const presetLines = Object.entries(AGENT_STACK.presets).map(([name, preset]) => ` ${name.padEnd(10)} ${preset.description}`);
|
|
415
419
|
return [
|
|
@@ -432,8 +436,11 @@ export function formatInteractiveCreateGuide() {
|
|
|
432
436
|
"Skill and MCP behavior:",
|
|
433
437
|
" Skills are copied into the project, not installed globally.",
|
|
434
438
|
" MCP records are written into configs/capabilities.yaml and docs/agent/generated/.",
|
|
439
|
+
" docs/agent/mcp-setup.md records enabled servers, optional catalog entries, env vars, and smoke tests.",
|
|
440
|
+
" default enables only low-friction arXiv; credentialed/local services are opt-in.",
|
|
435
441
|
" MCP installers are optional and run only finite installer commands.",
|
|
436
|
-
"
|
|
442
|
+
" MCP execution modes are explicit: uvx-runtime, npx-runtime, local-service, manual, or fallback.",
|
|
443
|
+
" Use `academic-research mcp env <server>` to inspect env vars and local prerequisites.",
|
|
437
444
|
""
|
|
438
445
|
].join("\n");
|
|
439
446
|
}
|
|
@@ -508,7 +515,7 @@ function printSkillsHelp() {
|
|
|
508
515
|
}
|
|
509
516
|
function printMcpHelp() {
|
|
510
517
|
console.log([
|
|
511
|
-
"Usage: academic-research mcp <list|enabled|available|commands|enable|disable|install|uninstall|doctor> [servers...]",
|
|
518
|
+
"Usage: academic-research mcp <list|enabled|available|commands|env|enable|disable|install|uninstall|doctor> [servers...]",
|
|
512
519
|
"",
|
|
513
520
|
"Manage MCP records and finite external MCP tool installs.",
|
|
514
521
|
"",
|
|
@@ -518,6 +525,34 @@ function printMcpHelp() {
|
|
|
518
525
|
" -h, --help Show this help."
|
|
519
526
|
].join("\n"));
|
|
520
527
|
}
|
|
528
|
+
function printMcpEnvironment(servers) {
|
|
529
|
+
for (const name of servers) {
|
|
530
|
+
const server = AGENT_STACK.mcp_servers[name];
|
|
531
|
+
let wroteLine = false;
|
|
532
|
+
for (const envName of server.required_env) {
|
|
533
|
+
console.log(`${name}\trequired\t${envName}`);
|
|
534
|
+
wroteLine = true;
|
|
535
|
+
}
|
|
536
|
+
for (const envName of server.recommended_env) {
|
|
537
|
+
console.log(`${name}\trecommended\t${envName}`);
|
|
538
|
+
wroteLine = true;
|
|
539
|
+
}
|
|
540
|
+
if (server.hosted_url) {
|
|
541
|
+
console.log(`${name}\thosted-endpoint\t${server.hosted_url}`);
|
|
542
|
+
wroteLine = true;
|
|
543
|
+
}
|
|
544
|
+
if (server.local_service) {
|
|
545
|
+
console.log(`${name}\tlocal-service\t${server.local_service}`);
|
|
546
|
+
wroteLine = true;
|
|
547
|
+
}
|
|
548
|
+
for (const command of server.setup_commands) {
|
|
549
|
+
console.log(`${name}\tsetup-command\t${command}`);
|
|
550
|
+
wroteLine = true;
|
|
551
|
+
}
|
|
552
|
+
if (!wroteLine)
|
|
553
|
+
console.log(`${name}\tnone\t-`);
|
|
554
|
+
}
|
|
555
|
+
}
|
|
521
556
|
function readPackageVersion() {
|
|
522
557
|
try {
|
|
523
558
|
const packageJson = JSON.parse(readFileSync(join(packageRoot, "package.json"), "utf8"));
|
package/dist/src/project.js
CHANGED
|
@@ -136,6 +136,7 @@ export async function doctorProject(root) {
|
|
|
136
136
|
"configs/agent-stack.yaml",
|
|
137
137
|
"configs/capabilities.yaml",
|
|
138
138
|
"docs/agent/capability-profile.md",
|
|
139
|
+
"docs/agent/mcp-setup.md",
|
|
139
140
|
"docs/agent/generated",
|
|
140
141
|
"sources/source-ledger.csv",
|
|
141
142
|
"sota/literature-matrix.csv",
|
|
@@ -206,7 +207,7 @@ async function writeGeneratedPackageJson(root, { slug }) {
|
|
|
206
207
|
const path = join(root, "package.json");
|
|
207
208
|
const data = await readJson(path);
|
|
208
209
|
const existingSpec = data.devDependencies?.["create-academic-research"];
|
|
209
|
-
const packageSpec = process.env.CREATE_ACADEMIC_RESEARCH_PACKAGE_SPEC ?? existingSpec ?? "0.1.
|
|
210
|
+
const packageSpec = process.env.CREATE_ACADEMIC_RESEARCH_PACKAGE_SPEC ?? existingSpec ?? "0.1.6";
|
|
210
211
|
data.name = slug;
|
|
211
212
|
data.devDependencies = {
|
|
212
213
|
...(data.devDependencies ?? {}),
|
package/dist/src/prompts.js
CHANGED
|
@@ -9,7 +9,8 @@ export async function askCreateOptions(defaults, locks = {}) {
|
|
|
9
9
|
const preset = await question(rl, "Capability preset", defaults.preset);
|
|
10
10
|
const agent = await question(rl, "Agent target", defaults.agent);
|
|
11
11
|
const installSkills = locks.installSkills ?? (await yesNo(rl, "Install project-local skills now", defaults.installSkills));
|
|
12
|
-
const installMcpTools = locks.installMcpTools ??
|
|
12
|
+
const installMcpTools = locks.installMcpTools ??
|
|
13
|
+
(await yesNo(rl, "Run finite external MCP tool installers now", defaults.installMcpTools));
|
|
13
14
|
return { title, slug, packageName, preset, agent, installSkills, installMcpTools };
|
|
14
15
|
}
|
|
15
16
|
finally {
|
package/dist/src/stack.d.ts
CHANGED
|
@@ -8,13 +8,21 @@ export interface CapabilityPreset {
|
|
|
8
8
|
mcp_servers: string[];
|
|
9
9
|
}
|
|
10
10
|
export interface McpServer {
|
|
11
|
+
readiness: string;
|
|
11
12
|
priority: string;
|
|
13
|
+
execution_mode: string;
|
|
12
14
|
source_need: string;
|
|
15
|
+
source: string;
|
|
16
|
+
hosted_url: string;
|
|
13
17
|
install_command: string;
|
|
14
18
|
uninstall_command: string;
|
|
19
|
+
setup_commands: string[];
|
|
15
20
|
command: string;
|
|
16
21
|
args: string[];
|
|
17
22
|
env: Record<string, string>;
|
|
23
|
+
required_env: string[];
|
|
24
|
+
recommended_env: string[];
|
|
25
|
+
local_service: string;
|
|
18
26
|
smoke_test: string;
|
|
19
27
|
risks: string;
|
|
20
28
|
}
|
package/dist/src/stack.js
CHANGED
|
@@ -20,38 +20,6 @@ export const AGENT_STACK = {
|
|
|
20
20
|
commands: [
|
|
21
21
|
"npm exec --yes --package skills -- skills add existential-birds/beagle {agent_flag} --skill docling --copy -y"
|
|
22
22
|
]
|
|
23
|
-
},
|
|
24
|
-
optional_connectors: {
|
|
25
|
-
description: "CLI-side literature connectors to use only when MCP servers are unavailable.",
|
|
26
|
-
commands: [
|
|
27
|
-
"npm exec --yes --package skills -- skills add davila7/claude-code-templates {agent_flag} --skill openalex-database --copy -y",
|
|
28
|
-
"npm exec --yes --package skills -- skills add agents365-ai/365-skills {agent_flag} --skill semanticscholar-skill --copy -y",
|
|
29
|
-
"npm exec --yes --package skills -- skills add fuzhiyu/researchprojecttemplate {agent_flag} --skill zotero-paper-reader --copy -y"
|
|
30
|
-
]
|
|
31
|
-
},
|
|
32
|
-
optional_mechanical_specialists: {
|
|
33
|
-
description: "Narrow mechanical helpers that do not replace project-native governance.",
|
|
34
|
-
commands: [
|
|
35
|
-
"npm exec --yes --package skills -- skills add bahayonghang/academic-writing-skills {agent_flag} --skill latex-paper-en --copy -y",
|
|
36
|
-
[
|
|
37
|
-
"npm exec --yes --package skills -- skills add lllllllama/ai-paper-reproduction-skill",
|
|
38
|
-
"{agent_flag}",
|
|
39
|
-
"--skill",
|
|
40
|
-
[
|
|
41
|
-
"ai-research-reproduction",
|
|
42
|
-
"repo-intake-and-plan",
|
|
43
|
-
"env-and-assets-bootstrap",
|
|
44
|
-
"minimal-run-and-audit",
|
|
45
|
-
"paper-context-resolver",
|
|
46
|
-
"analyze-project",
|
|
47
|
-
"safe-debug",
|
|
48
|
-
"run-train",
|
|
49
|
-
"explore-run",
|
|
50
|
-
"explore-code"
|
|
51
|
-
].join(" "),
|
|
52
|
-
"--copy -y"
|
|
53
|
-
].join(" ")
|
|
54
|
-
]
|
|
55
23
|
}
|
|
56
24
|
},
|
|
57
25
|
presets: {
|
|
@@ -61,119 +29,205 @@ export const AGENT_STACK = {
|
|
|
61
29
|
mcp_servers: []
|
|
62
30
|
},
|
|
63
31
|
default: {
|
|
64
|
-
description: "Clean academic research setup with
|
|
32
|
+
description: "Clean academic research setup with the low-friction arXiv MCP record.",
|
|
65
33
|
skill_bundles: ["academic_research"],
|
|
66
|
-
mcp_servers: ["arxiv"
|
|
34
|
+
mcp_servers: ["arxiv"]
|
|
67
35
|
},
|
|
68
36
|
enhanced: {
|
|
69
37
|
description: "Default academic setup plus complementary agent engineering, document, frontend, testing, and doc conversion skills.",
|
|
70
38
|
skill_bundles: ["academic_research", "default_complementary", "docling"],
|
|
71
|
-
mcp_servers: ["arxiv"
|
|
39
|
+
mcp_servers: ["arxiv"]
|
|
72
40
|
},
|
|
73
41
|
literature: {
|
|
74
|
-
description: "Literature-heavy SOTA, survey, scoping, or systematic review setup.",
|
|
42
|
+
description: "Literature-heavy SOTA, survey, scoping, or systematic review setup with CS bibliography support.",
|
|
75
43
|
skill_bundles: ["academic_research", "default_complementary", "docling"],
|
|
76
|
-
mcp_servers: ["arxiv", "
|
|
44
|
+
mcp_servers: ["arxiv", "dblp"]
|
|
77
45
|
},
|
|
78
46
|
writing: {
|
|
79
|
-
description: "Paper-writing
|
|
80
|
-
skill_bundles: [
|
|
81
|
-
|
|
82
|
-
"default_complementary",
|
|
83
|
-
"docling",
|
|
84
|
-
"optional_mechanical_specialists"
|
|
85
|
-
],
|
|
86
|
-
mcp_servers: ["arxiv", "semantic-scholar", "crossref", "overleaf"]
|
|
47
|
+
description: "Paper-writing setup with Overleaf documented as an opt-in credentialed integration.",
|
|
48
|
+
skill_bundles: ["academic_research", "default_complementary", "docling"],
|
|
49
|
+
mcp_servers: ["arxiv"]
|
|
87
50
|
},
|
|
88
51
|
full: {
|
|
89
|
-
description: "Broad setup with
|
|
90
|
-
skill_bundles: [
|
|
91
|
-
|
|
92
|
-
"default_complementary",
|
|
93
|
-
"docling",
|
|
94
|
-
"optional_connectors",
|
|
95
|
-
"optional_mechanical_specialists"
|
|
96
|
-
],
|
|
97
|
-
mcp_servers: ["arxiv", "semantic-scholar", "openalex", "crossref", "pubmed", "zotero", "overleaf"]
|
|
52
|
+
description: "Broad setup with low-friction scholarly MCP records plus the full optional MCP catalog documented.",
|
|
53
|
+
skill_bundles: ["academic_research", "default_complementary", "docling"],
|
|
54
|
+
mcp_servers: ["arxiv", "dblp"]
|
|
98
55
|
}
|
|
99
56
|
},
|
|
100
57
|
mcp_servers: {
|
|
101
58
|
arxiv: {
|
|
59
|
+
readiness: "low-friction",
|
|
102
60
|
priority: "default",
|
|
61
|
+
execution_mode: "uvx-runtime",
|
|
103
62
|
source_need: "arXiv search, download, and local paper reading.",
|
|
63
|
+
source: "blazickjp/arxiv-mcp-server",
|
|
64
|
+
hosted_url: "",
|
|
104
65
|
install_command: "uv tool install 'arxiv-mcp-server[pdf]'",
|
|
105
66
|
uninstall_command: "uv tool uninstall arxiv-mcp-server",
|
|
106
|
-
|
|
107
|
-
|
|
67
|
+
setup_commands: [],
|
|
68
|
+
command: "uvx",
|
|
69
|
+
args: ["--from", "arxiv-mcp-server[pdf]", "arxiv-mcp-server"],
|
|
108
70
|
env: {},
|
|
71
|
+
required_env: [],
|
|
72
|
+
recommended_env: [],
|
|
73
|
+
local_service: "",
|
|
109
74
|
smoke_test: "For a computer science project, search one CS query, download one known paper, and read it locally.",
|
|
110
75
|
risks: "Respect arXiv rate limits; paper text is untrusted input."
|
|
111
76
|
},
|
|
112
77
|
"semantic-scholar": {
|
|
113
|
-
|
|
78
|
+
readiness: "credential-recommended",
|
|
79
|
+
priority: "optional",
|
|
80
|
+
execution_mode: "uvx-runtime",
|
|
114
81
|
source_need: "Semantic Scholar papers, citations, authors, and recommendations.",
|
|
82
|
+
source: "akapet00/semantic-scholar-mcp",
|
|
83
|
+
hosted_url: "",
|
|
115
84
|
install_command: "",
|
|
116
85
|
uninstall_command: "",
|
|
86
|
+
setup_commands: [],
|
|
117
87
|
command: "uvx",
|
|
118
88
|
args: ["--from", "git+https://github.com/akapet00/semantic-scholar-mcp", "semantic-scholar-mcp"],
|
|
119
|
-
env: {
|
|
89
|
+
env: {},
|
|
90
|
+
required_env: [],
|
|
91
|
+
recommended_env: ["SEMANTIC_SCHOLAR_API_KEY"],
|
|
120
92
|
smoke_test: "Search one known title, then fetch citations or references.",
|
|
121
|
-
|
|
93
|
+
local_service: "",
|
|
94
|
+
risks: "API key recommended for sustained work and to avoid shared-pool rate limits; metadata can be incomplete."
|
|
122
95
|
},
|
|
123
96
|
openalex: {
|
|
124
|
-
|
|
97
|
+
readiness: "credential-required",
|
|
98
|
+
priority: "optional",
|
|
99
|
+
execution_mode: "npx-runtime",
|
|
125
100
|
source_need: "OpenAlex broad scholarly graph.",
|
|
101
|
+
source: "cyanheads/openalex-mcp-server",
|
|
102
|
+
hosted_url: "https://openalex.caseyjhand.com/mcp",
|
|
126
103
|
install_command: "",
|
|
127
104
|
uninstall_command: "",
|
|
105
|
+
setup_commands: [],
|
|
128
106
|
command: "npx",
|
|
129
|
-
args: ["-y", "@cyanheads/openalex-mcp-server"],
|
|
130
|
-
env: {
|
|
107
|
+
args: ["-y", "@cyanheads/openalex-mcp-server@latest"],
|
|
108
|
+
env: {},
|
|
109
|
+
required_env: ["OPENALEX_API_KEY"],
|
|
110
|
+
recommended_env: [],
|
|
111
|
+
local_service: "",
|
|
131
112
|
smoke_test: "Search works by title or DOI and confirm stable OpenAlex IDs.",
|
|
132
|
-
risks: "
|
|
113
|
+
risks: "The selected local server requires OPENALEX_API_KEY. OpenAlex keys are free for normal academic use with daily free usage; smoke-test coverage and cost headers before high-volume work."
|
|
133
114
|
},
|
|
134
115
|
crossref: {
|
|
116
|
+
readiness: "manual",
|
|
135
117
|
priority: "manual",
|
|
118
|
+
execution_mode: "manual",
|
|
136
119
|
source_need: "DOI and publication metadata.",
|
|
120
|
+
source: "manual selection required; candidate: AiAgentKarl/crossref-academic-mcp-server",
|
|
121
|
+
hosted_url: "",
|
|
137
122
|
install_command: "",
|
|
138
123
|
uninstall_command: "",
|
|
124
|
+
setup_commands: [],
|
|
139
125
|
command: "",
|
|
140
126
|
args: [],
|
|
141
127
|
env: {},
|
|
128
|
+
required_env: [],
|
|
129
|
+
recommended_env: [],
|
|
130
|
+
local_service: "",
|
|
142
131
|
smoke_test: "Resolve one DOI into publication metadata after choosing a maintained local server.",
|
|
143
|
-
risks: "Manual integration only;
|
|
132
|
+
risks: "Manual integration only; current zero-friction Crossref-only MCP candidates are less mature than arXiv, DBLP, PubMed, or OpenAlex."
|
|
144
133
|
},
|
|
145
134
|
pubmed: {
|
|
135
|
+
readiness: "domain-specific",
|
|
146
136
|
priority: "domain-specific",
|
|
137
|
+
execution_mode: "npx-runtime",
|
|
147
138
|
source_need: "PubMed and biomedical literature.",
|
|
139
|
+
source: "cyanheads/pubmed-mcp-server",
|
|
140
|
+
hosted_url: "https://pubmed.caseyjhand.com/mcp",
|
|
148
141
|
install_command: "",
|
|
149
142
|
uninstall_command: "",
|
|
143
|
+
setup_commands: [],
|
|
150
144
|
command: "npx",
|
|
151
|
-
args: ["-y", "@cyanheads/pubmed-mcp-server"],
|
|
152
|
-
env: {
|
|
145
|
+
args: ["-y", "@cyanheads/pubmed-mcp-server@latest"],
|
|
146
|
+
env: { MCP_TRANSPORT_TYPE: "stdio", MCP_LOG_LEVEL: "warning" },
|
|
147
|
+
required_env: [],
|
|
148
|
+
recommended_env: ["NCBI_API_KEY", "NCBI_ADMIN_EMAIL"],
|
|
149
|
+
local_service: "",
|
|
153
150
|
smoke_test: "Search one PMID or title and fetch metadata.",
|
|
154
|
-
risks: "Domain-specific; observe NCBI rate limits."
|
|
151
|
+
risks: "Domain-specific; observe NCBI rate limits. API key and contact email improve reliability."
|
|
152
|
+
},
|
|
153
|
+
dblp: {
|
|
154
|
+
readiness: "low-friction-cs",
|
|
155
|
+
priority: "cs",
|
|
156
|
+
execution_mode: "uvx-runtime",
|
|
157
|
+
source_need: "DBLP computer science bibliography, venues, authors, and BibTeX.",
|
|
158
|
+
source: "szeider/mcp-dblp",
|
|
159
|
+
hosted_url: "",
|
|
160
|
+
install_command: "",
|
|
161
|
+
uninstall_command: "",
|
|
162
|
+
setup_commands: [],
|
|
163
|
+
command: "uvx",
|
|
164
|
+
args: ["mcp-dblp"],
|
|
165
|
+
env: {},
|
|
166
|
+
required_env: [],
|
|
167
|
+
recommended_env: [],
|
|
168
|
+
local_service: "",
|
|
169
|
+
smoke_test: "Search one known CS paper title and export or inspect its DBLP BibTeX.",
|
|
170
|
+
risks: "CS-specific metadata source; use with arXiv/Semantic Scholar/OpenAlex for coverage beyond DBLP."
|
|
155
171
|
},
|
|
156
172
|
zotero: {
|
|
173
|
+
readiness: "local-service",
|
|
157
174
|
priority: "local-library",
|
|
175
|
+
execution_mode: "local-service",
|
|
158
176
|
source_need: "Zotero local library and attachments.",
|
|
177
|
+
source: "eric-tramel/zoty",
|
|
178
|
+
hosted_url: "",
|
|
159
179
|
install_command: "",
|
|
160
180
|
uninstall_command: "",
|
|
181
|
+
setup_commands: ["uvx --refresh zoty setup", "uvx --refresh zoty doctor"],
|
|
161
182
|
command: "uvx",
|
|
162
183
|
args: ["zoty", "mcp"],
|
|
163
184
|
env: {},
|
|
185
|
+
required_env: [],
|
|
186
|
+
recommended_env: [],
|
|
187
|
+
local_service: "Zotero desktop running with local API enabled; Zoty Bridge required for attachment and collection write operations.",
|
|
164
188
|
smoke_test: "List collections, search one known item, and export BibTeX.",
|
|
165
189
|
risks: "Requires Zotero local API and bridge setup."
|
|
166
190
|
},
|
|
167
191
|
overleaf: {
|
|
192
|
+
readiness: "manual-credentialed",
|
|
168
193
|
priority: "writing",
|
|
194
|
+
execution_mode: "manual-local",
|
|
169
195
|
source_need: "Overleaf project sync.",
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
196
|
+
source: "YounesBensafia/overleaf-mcp-server",
|
|
197
|
+
hosted_url: "",
|
|
198
|
+
install_command: "",
|
|
199
|
+
uninstall_command: "",
|
|
200
|
+
setup_commands: [],
|
|
201
|
+
command: "",
|
|
202
|
+
args: [],
|
|
203
|
+
env: {},
|
|
204
|
+
required_env: ["OVERLEAF_TOKEN"],
|
|
205
|
+
recommended_env: ["PROJECT_ID"],
|
|
206
|
+
local_service: "Local clone of the Overleaf MCP server configured with uv and an Overleaf project that supports Git sync.",
|
|
175
207
|
smoke_test: "List projects or read one .tex file; do not write by default.",
|
|
176
|
-
risks: "Requires token setup; write access needs explicit approval."
|
|
208
|
+
risks: "Requires token and project setup; write/push access needs explicit approval."
|
|
209
|
+
},
|
|
210
|
+
"paper-search": {
|
|
211
|
+
readiness: "fallback",
|
|
212
|
+
priority: "fallback",
|
|
213
|
+
execution_mode: "manual-fallback",
|
|
214
|
+
source_need: "Multi-source paper search and download fallback across many scholarly sources.",
|
|
215
|
+
source: "openags/paper-search-mcp",
|
|
216
|
+
hosted_url: "",
|
|
217
|
+
install_command: "",
|
|
218
|
+
uninstall_command: "",
|
|
219
|
+
setup_commands: [],
|
|
220
|
+
command: "",
|
|
221
|
+
args: [],
|
|
222
|
+
env: {},
|
|
223
|
+
required_env: [],
|
|
224
|
+
recommended_env: [
|
|
225
|
+
"PAPER_SEARCH_MCP_UNPAYWALL_EMAIL",
|
|
226
|
+
"PAPER_SEARCH_MCP_SEMANTIC_SCHOLAR_API_KEY"
|
|
227
|
+
],
|
|
228
|
+
local_service: "Manual review required before enabling; configure only permitted sources.",
|
|
229
|
+
smoke_test: "Search one harmless query with a source allow-list and verify provenance for each result.",
|
|
230
|
+
risks: "Powerful aggregator with optional restricted-source workflows; keep Sci-Hub or questionable download features disabled unless explicitly accepted."
|
|
177
231
|
}
|
|
178
232
|
}
|
|
179
233
|
};
|
package/package.json
CHANGED
package/template/README.md
CHANGED
|
@@ -58,19 +58,25 @@ npx academic-research skills install --preset default
|
|
|
58
58
|
npx academic-research skills install --preset enhanced
|
|
59
59
|
npx academic-research skills list
|
|
60
60
|
npx academic-research skills status
|
|
61
|
-
npx academic-research mcp enable arxiv semantic-scholar openalex
|
|
62
61
|
npx academic-research mcp list
|
|
62
|
+
npx academic-research mcp env openalex semantic-scholar zotero
|
|
63
|
+
npx academic-research mcp enable arxiv dblp
|
|
63
64
|
npx academic-research mcp commands arxiv
|
|
64
65
|
npx academic-research mcp install arxiv
|
|
66
|
+
npx academic-research mcp doctor
|
|
65
67
|
```
|
|
66
68
|
|
|
67
69
|
`skills list` reports installed project-local skills. `skills presets` reports
|
|
68
70
|
available install presets. `mcp enable` changes project records. `mcp commands`
|
|
69
|
-
prints finite external install commands without running them. `mcp
|
|
70
|
-
|
|
71
|
-
|
|
71
|
+
prints finite external install commands without running them. `mcp env` prints
|
|
72
|
+
env vars, hosted endpoints, local prerequisites, and setup commands before you
|
|
73
|
+
enable optional servers. `mcp install` runs only finite tool installation
|
|
74
|
+
commands; runtime-only `uvx`/`npx` MCP servers may have no install step and are
|
|
75
|
+
started later by the MCP client.
|
|
72
76
|
|
|
73
77
|
`default` installs the companion academic research skill package and keeps the
|
|
74
|
-
MCP records focused on
|
|
75
|
-
|
|
76
|
-
|
|
78
|
+
MCP records focused on low-friction arXiv discovery. `literature` and `full`
|
|
79
|
+
add DBLP for computer science bibliography. Credentialed, local-service, or
|
|
80
|
+
domain-specific MCP servers such as OpenAlex, Semantic Scholar, PubMed, Zotero,
|
|
81
|
+
and Overleaf should be enabled only after reading `docs/agent/mcp-setup.md` and
|
|
82
|
+
checking their prerequisites with `mcp env`.
|
package/template/package.json
CHANGED
|
@@ -9,9 +9,10 @@
|
|
|
9
9
|
"skills:presets": "academic-research skills presets",
|
|
10
10
|
"mcp:list": "academic-research mcp list",
|
|
11
11
|
"mcp:commands": "academic-research mcp commands",
|
|
12
|
+
"mcp:env": "academic-research mcp env",
|
|
12
13
|
"mcp:doctor": "academic-research mcp doctor"
|
|
13
14
|
},
|
|
14
15
|
"devDependencies": {
|
|
15
|
-
"create-academic-research": "0.1.
|
|
16
|
+
"create-academic-research": "0.1.6"
|
|
16
17
|
}
|
|
17
18
|
}
|