apick-mcp 3.2.0 → 3.2.2
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/CHANGELOG.md +12 -1
- package/TOOLS.md +15 -9
- package/package.json +1 -1
- package/src/index.js +92 -92
package/CHANGELOG.md
CHANGED
|
@@ -1,4 +1,15 @@
|
|
|
1
|
-
# 변경 기록
|
|
1
|
+
# 변경 기록
|
|
2
|
+
|
|
3
|
+
## 3.2.2 - 2026-09-14
|
|
4
|
+
|
|
5
|
+
- 운전면허 `ghost_num`의 생략·빈값·임의 문자열 허용과 판정 미사용 계약을 한영 문서에 명시했습니다.
|
|
6
|
+
- 운전면허 불일치와 무과금 처리 실패를 구분하고, 응답에 조회 페이지 HTML을 포함하지 않는 계약을 안내합니다.
|
|
7
|
+
- Clarify optional driver-license serial input, match semantics, safe messages, and uncharged processing failures.
|
|
8
|
+
|
|
9
|
+
## 3.2.1 - 2026-09-14
|
|
10
|
+
|
|
11
|
+
- Seedance 영상 생성 요금을 해상도별로 세분화(480p 560P·720p 1,250P·1080p 2,810P)하고 1080p 해상도를 지원합니다.
|
|
12
|
+
- Kling 영상 생성 요금을 std 410P·pro 550P로 갱신했습니다.
|
|
2
13
|
|
|
3
14
|
## 3.2.0 - 2026-09-14
|
|
4
15
|
|
package/TOOLS.md
CHANGED
|
@@ -434,9 +434,13 @@ Verify the authenticity of a Korean resident registration card (jumin-deungnokje
|
|
|
434
434
|
|
|
435
435
|
### `identi_card2` — [Text] 운전면허증 진위 확인
|
|
436
436
|
|
|
437
|
-
|
|
437
|
+
Check Korean driver license number and personal details. `ghost_num` is optional: omit it, send an empty string, or send any string. Its content is not used in the match decision. This tool does not verify the serial number itself or the physical document's authenticity.
|
|
438
438
|
|
|
439
|
-
|
|
439
|
+
운전면허번호와 인적사항의 일치 여부를 조회합니다. birth_y, birth_m, birth_d, name과 면허번호 4구획(licen_no0~licen_no3)은 필수입니다. ghost_num(식별번호)은 생략·빈값·임의 문자열 모두 허용하며 전달값은 판정에 사용하지 않습니다. rrn1, rrn2도 선택 입력입니다. 암호일련번호 자체나 실물 면허증의 위·변조 여부는 검증하지 않습니다. 정보주체의 동의 등 적법한 처리 근거를 확보한 경우에만 사용하십시오.
|
|
440
|
+
|
|
441
|
+
`result=0` means a mismatch and `result=1` means a match. An unconfirmed result returns HTTP 424 (`result=2`); a timeout returns HTTP 408 (`result=3`). These processing failures are not charged. Responses contain short public messages, never source-page HTML.
|
|
442
|
+
|
|
443
|
+
`result=0`은 불일치, `result=1`은 일치입니다. 판정 확인 실패는 HTTP 424(`result=2`), 시간 초과는 HTTP 408(`result=3`)이며 과금되지 않습니다. 응답에는 짧은 안내 문구만 포함되고 조회 페이지 HTML은 포함되지 않습니다.
|
|
440
444
|
|
|
441
445
|
> 읽기 전용 / read-only · 외부 데이터 조회 / external lookup · server `identity`
|
|
442
446
|
|
|
@@ -450,7 +454,7 @@ Verify the authenticity of a Korean driver license using text input.
|
|
|
450
454
|
| `licen_no1` | `string` | **필수 / required** | 면허번호 2구획 (예: 19) |
|
|
451
455
|
| `licen_no2` | `string` | **필수 / required** | 면허번호 3구획 (예: 174133) |
|
|
452
456
|
| `licen_no3` | `string` | **필수 / required** | 면허번호 4구획 (예: 01) |
|
|
453
|
-
| `ghost_num` | `string` | 선택 / optional |
|
|
457
|
+
| `ghost_num` | `string` | 선택 / optional | 생략·빈값 허용, 전달값은 판정에 사용하지 않음 / May be omitted or empty; not used in the match decision |
|
|
454
458
|
| `rrn1` | `string` | 선택 / optional | 주민등록번호 앞 6자리 (선택) |
|
|
455
459
|
| `rrn2` | `string` | 선택 / optional | 주민등록번호 뒤 7자리 (선택) |
|
|
456
460
|
|
|
@@ -1841,7 +1845,7 @@ Polish a text (up to 100,000 characters) by fixing grammar, spelling, and awkwar
|
|
|
1841
1845
|
|
|
1842
1846
|
Submit an asynchronous Seedance video generation job combining text, image, or reference inputs into up to a 30-second video.
|
|
1843
1847
|
|
|
1844
|
-
Seedance 영상 생성 작업을 비동기로 접수합니다. text/image/reference 세 가지 mode를 지원하며, `seedance_jobs_status` Tool로 상태를 조회하고 완료되면 응답의 `result_url`(REST 다운로드 주소, 7일 이내 유효)로 다운로드합니다. 접수 시 `duration × 초당
|
|
1848
|
+
Seedance 영상 생성 작업을 비동기로 접수합니다. text/image/reference 세 가지 mode를 지원하며, `seedance_jobs_status` Tool로 상태를 조회하고 완료되면 응답의 `result_url`(REST 다운로드 주소, 7일 이내 유효)로 다운로드합니다. 접수 시 `duration × 초당 포인트`(해상도별 단가는 요금 절 참고)가 예약 차감되고 완료 시 확정, 실패·시간 초과 시 전액 환불됩니다.
|
|
1845
1849
|
|
|
1846
1850
|
> **부작용 있음 / has side effects** · 외부 데이터 조회 / external lookup · server `ai`
|
|
1847
1851
|
|
|
@@ -1851,7 +1855,7 @@ Seedance 영상 생성 작업을 비동기로 접수합니다. text/image/refere
|
|
|
1851
1855
|
| `mode` | `string` | 선택 / optional | 입력 방식 — 'text'(텍스트만) \| 'image'(첫 프레임 이미지 지정) \| 'reference'(참조 이미지·영상으로 주체 지정). 기본 text |
|
|
1852
1856
|
| `duration` | `integer` | 선택 / optional | 영상 길이(초), 4~30, 기본 5 |
|
|
1853
1857
|
| `aspect_ratio` | `string` | 선택 / optional | 가로세로 비율 — `16:9`, `4:3`, `1:1`, `3:4`, `9:16`, `21:9`, `adaptive` 중 하나, 기본 16:9 |
|
|
1854
|
-
| `resolution` | `string` | 선택 / optional | 해상도 — `480p`, `720p` 중 하나, 기본 720p |
|
|
1858
|
+
| `resolution` | `string` | 선택 / optional | 해상도 — `480p`, `720p`, `1080p` 중 하나, 기본 720p. 해상도별로 초당 포인트가 다릅니다(요금 절 참고, 높을수록 비용 증가) |
|
|
1855
1859
|
| `audio` | `boolean` | 선택 / optional | 오디오 생성 여부, 기본 true. 생성된 오디오가 정책(저작권 등) 검수에서 거부되면 작업이 실패하고 전액 환불됩니다 |
|
|
1856
1860
|
| `idempotency_key` | `string` | 선택 / optional | 같은 요청의 재전송으로 인한 중복 접수·과금을 막는 고유 키 |
|
|
1857
1861
|
| `image_url` | `string` (file) | 선택 / optional | image 모드에서 사용할 첫 프레임 이미지 URL — https URL, image/png, image/jpeg, image/webp, 최대 50MB |
|
|
@@ -1998,13 +2002,15 @@ Current rates 단가표: <https://apick.app/dev_guide/mcp> · Sign up for 1,000
|
|
|
1998
2002
|
Video generation is billed per second of output (`duration × per-second points`), not per call — the rate above is per second, not per video.
|
|
1999
2003
|
영상 생성은 호출당이 아니라 초당 과금입니다(`duration × 초당 포인트`) — 아래 단가는 1초당 포인트입니다.
|
|
2000
2004
|
|
|
2001
|
-
| Model 모델 | Tier
|
|
2005
|
+
| Model 모델 | Tier·Resolution 등급·해상도 | Points/sec 초당 포인트 |
|
|
2002
2006
|
| --- | --- | --- |
|
|
2003
|
-
| Seedance | standard |
|
|
2007
|
+
| Seedance | standard · 480p | 560P |
|
|
2008
|
+
| Seedance | standard · 720p | 1,250P |
|
|
2009
|
+
| Seedance | standard · 1080p | 2,810P |
|
|
2004
2010
|
| Veo | standard | 900P |
|
|
2005
2011
|
| Veo | fast | 360P |
|
|
2006
|
-
| Kling | std |
|
|
2007
|
-
| Kling | pro |
|
|
2012
|
+
| Kling | std | 410P |
|
|
2013
|
+
| Kling | pro | 550P |
|
|
2008
2014
|
|
|
2009
2015
|
## TTS quality and recovery / TTS 검수와 재개
|
|
2010
2016
|
|
package/package.json
CHANGED
package/src/index.js
CHANGED
|
@@ -1,92 +1,92 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
// apick-mcp - run the APICK MCP server over stdio.
|
|
3
|
-
//
|
|
4
|
-
// Usage:
|
|
5
|
-
// apick-mcp [--server <name>]
|
|
6
|
-
//
|
|
7
|
-
// Environment:
|
|
8
|
-
// APICK_API_KEY APICK license key. Optional: tools/list works without one,
|
|
9
|
-
// tools/call needs it.
|
|
10
|
-
// APICK_MCP_SERVER Which server to expose (default: all).
|
|
11
|
-
// APICK_MCP_URL Base URL override (default: https://apick.app/mcp).
|
|
12
|
-
|
|
13
|
-
import { readFileSync } from 'node:fs';
|
|
14
|
-
import { fileURLToPath } from 'node:url';
|
|
15
|
-
import { createBridge, DEFAULT_ENDPOINT, SERVERS } from './bridge.js';
|
|
16
|
-
|
|
17
|
-
const HELP = `apick-mcp - APICK MCP server over stdio
|
|
18
|
-
|
|
19
|
-
apick-mcp [--server <name>]
|
|
20
|
-
|
|
21
|
-
Options
|
|
22
|
-
--server, -s <name> ${SERVERS.join(', ')} (default: all)
|
|
23
|
-
--version, -v print version
|
|
24
|
-
--help, -h print this message
|
|
25
|
-
|
|
26
|
-
Environment
|
|
27
|
-
APICK_API_KEY APICK license key (get one at https://apick.app)
|
|
28
|
-
APICK_MCP_SERVER same as --server
|
|
29
|
-
APICK_MCP_URL base URL override (default: ${DEFAULT_ENDPOINT})
|
|
30
|
-
|
|
31
|
-
Clients that support remote MCP can skip this bridge and connect straight to
|
|
32
|
-
${DEFAULT_ENDPOINT}/all with an Authorization: Bearer header.
|
|
33
|
-
Docs: https://apick.app/dev_guide/mcp
|
|
34
|
-
`;
|
|
35
|
-
|
|
36
|
-
function parseArgs(argv) {
|
|
37
|
-
const args = { server: process.env.APICK_MCP_SERVER || 'all' };
|
|
38
|
-
for (let i = 0; i < argv.length; i++) {
|
|
39
|
-
const arg = argv[i];
|
|
40
|
-
if (arg === '--help' || arg === '-h') args.help = true;
|
|
41
|
-
else if (arg === '--version' || arg === '-v') args.version = true;
|
|
42
|
-
else if (arg === '--server' || arg === '-s') args.server = argv[++i];
|
|
43
|
-
else if (arg.startsWith('--server=')) args.server = arg.slice('--server='.length);
|
|
44
|
-
else args.unknown = arg;
|
|
45
|
-
}
|
|
46
|
-
return args;
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
async function main() {
|
|
50
|
-
const args = parseArgs(process.argv.slice(2));
|
|
51
|
-
|
|
52
|
-
if (args.help) {
|
|
53
|
-
process.stdout.write(HELP);
|
|
54
|
-
return;
|
|
55
|
-
}
|
|
56
|
-
if (args.version) {
|
|
57
|
-
const pkgPath = fileURLToPath(new URL('../package.json', import.meta.url));
|
|
58
|
-
process.stdout.write(JSON.parse(readFileSync(pkgPath, 'utf8')).version + '\n');
|
|
59
|
-
return;
|
|
60
|
-
}
|
|
61
|
-
if (args.unknown) {
|
|
62
|
-
process.stderr.write('apick-mcp: unknown argument ' + args.unknown + '\n\n' + HELP);
|
|
63
|
-
process.exitCode = 2;
|
|
64
|
-
return;
|
|
65
|
-
}
|
|
66
|
-
if (!SERVERS.includes(args.server)) {
|
|
67
|
-
process.stderr.write(
|
|
68
|
-
'apick-mcp: unknown server "' + args.server + '". Available: ' + SERVERS.join(', ') + '\n'
|
|
69
|
-
);
|
|
70
|
-
process.exitCode = 2;
|
|
71
|
-
return;
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
const bridge = createBridge({
|
|
75
|
-
server: args.server,
|
|
76
|
-
apiKey: process.env.APICK_API_KEY,
|
|
77
|
-
endpoint: process.env.APICK_MCP_URL
|
|
78
|
-
});
|
|
79
|
-
|
|
80
|
-
if (!process.env.APICK_API_KEY) {
|
|
81
|
-
process.stderr.write(
|
|
82
|
-
'apick-mcp: no APICK_API_KEY set - tool discovery works, tool calls will ask you to sign in at https://apick.app\n'
|
|
83
|
-
);
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
await bridge.attach(process.stdin);
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
main().catch((err) => {
|
|
90
|
-
process.stderr.write('apick-mcp: ' + err.message + '\n');
|
|
91
|
-
process.exitCode = 1;
|
|
92
|
-
});
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// apick-mcp - run the APICK MCP server over stdio.
|
|
3
|
+
//
|
|
4
|
+
// Usage:
|
|
5
|
+
// apick-mcp [--server <name>]
|
|
6
|
+
//
|
|
7
|
+
// Environment:
|
|
8
|
+
// APICK_API_KEY APICK license key. Optional: tools/list works without one,
|
|
9
|
+
// tools/call needs it.
|
|
10
|
+
// APICK_MCP_SERVER Which server to expose (default: all).
|
|
11
|
+
// APICK_MCP_URL Base URL override (default: https://apick.app/mcp).
|
|
12
|
+
|
|
13
|
+
import { readFileSync } from 'node:fs';
|
|
14
|
+
import { fileURLToPath } from 'node:url';
|
|
15
|
+
import { createBridge, DEFAULT_ENDPOINT, SERVERS } from './bridge.js';
|
|
16
|
+
|
|
17
|
+
const HELP = `apick-mcp - APICK MCP server over stdio
|
|
18
|
+
|
|
19
|
+
apick-mcp [--server <name>]
|
|
20
|
+
|
|
21
|
+
Options
|
|
22
|
+
--server, -s <name> ${SERVERS.join(', ')} (default: all)
|
|
23
|
+
--version, -v print version
|
|
24
|
+
--help, -h print this message
|
|
25
|
+
|
|
26
|
+
Environment
|
|
27
|
+
APICK_API_KEY APICK license key (get one at https://apick.app)
|
|
28
|
+
APICK_MCP_SERVER same as --server
|
|
29
|
+
APICK_MCP_URL base URL override (default: ${DEFAULT_ENDPOINT})
|
|
30
|
+
|
|
31
|
+
Clients that support remote MCP can skip this bridge and connect straight to
|
|
32
|
+
${DEFAULT_ENDPOINT}/all with an Authorization: Bearer header.
|
|
33
|
+
Docs: https://apick.app/dev_guide/mcp
|
|
34
|
+
`;
|
|
35
|
+
|
|
36
|
+
function parseArgs(argv) {
|
|
37
|
+
const args = { server: process.env.APICK_MCP_SERVER || 'all' };
|
|
38
|
+
for (let i = 0; i < argv.length; i++) {
|
|
39
|
+
const arg = argv[i];
|
|
40
|
+
if (arg === '--help' || arg === '-h') args.help = true;
|
|
41
|
+
else if (arg === '--version' || arg === '-v') args.version = true;
|
|
42
|
+
else if (arg === '--server' || arg === '-s') args.server = argv[++i];
|
|
43
|
+
else if (arg.startsWith('--server=')) args.server = arg.slice('--server='.length);
|
|
44
|
+
else args.unknown = arg;
|
|
45
|
+
}
|
|
46
|
+
return args;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
async function main() {
|
|
50
|
+
const args = parseArgs(process.argv.slice(2));
|
|
51
|
+
|
|
52
|
+
if (args.help) {
|
|
53
|
+
process.stdout.write(HELP);
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
if (args.version) {
|
|
57
|
+
const pkgPath = fileURLToPath(new URL('../package.json', import.meta.url));
|
|
58
|
+
process.stdout.write(JSON.parse(readFileSync(pkgPath, 'utf8')).version + '\n');
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
if (args.unknown) {
|
|
62
|
+
process.stderr.write('apick-mcp: unknown argument ' + args.unknown + '\n\n' + HELP);
|
|
63
|
+
process.exitCode = 2;
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
if (!SERVERS.includes(args.server)) {
|
|
67
|
+
process.stderr.write(
|
|
68
|
+
'apick-mcp: unknown server "' + args.server + '". Available: ' + SERVERS.join(', ') + '\n'
|
|
69
|
+
);
|
|
70
|
+
process.exitCode = 2;
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
const bridge = createBridge({
|
|
75
|
+
server: args.server,
|
|
76
|
+
apiKey: process.env.APICK_API_KEY,
|
|
77
|
+
endpoint: process.env.APICK_MCP_URL
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
if (!process.env.APICK_API_KEY) {
|
|
81
|
+
process.stderr.write(
|
|
82
|
+
'apick-mcp: no APICK_API_KEY set - tool discovery works, tool calls will ask you to sign in at https://apick.app\n'
|
|
83
|
+
);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
await bridge.attach(process.stdin);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
main().catch((err) => {
|
|
90
|
+
process.stderr.write('apick-mcp: ' + err.message + '\n');
|
|
91
|
+
process.exitCode = 1;
|
|
92
|
+
});
|