@fre4x/fred 1.0.64 → 1.0.65-beta.1
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/dist/index.js +53 -27
- package/package.json +2 -2
package/dist/index.js
CHANGED
|
@@ -45853,20 +45853,30 @@ var {
|
|
|
45853
45853
|
// src/api.ts
|
|
45854
45854
|
var FRED_BASE_URL = "https://api.stlouisfed.org/fred";
|
|
45855
45855
|
var httpsAgent = new https2.Agent({ keepAlive: true });
|
|
45856
|
+
function getApiKey() {
|
|
45857
|
+
const key = process.env.FRED_API_KEY;
|
|
45858
|
+
if (!key) {
|
|
45859
|
+
throw new Error(
|
|
45860
|
+
"FRED_API_KEY environment variable not set. Please set it to use this server."
|
|
45861
|
+
);
|
|
45862
|
+
}
|
|
45863
|
+
return key;
|
|
45864
|
+
}
|
|
45865
|
+
function buildRequestParams(params) {
|
|
45866
|
+
const filteredEntries = Object.entries(params).filter(
|
|
45867
|
+
([, value]) => value !== void 0
|
|
45868
|
+
);
|
|
45869
|
+
return Object.fromEntries([
|
|
45870
|
+
...filteredEntries,
|
|
45871
|
+
["api_key", getApiKey()],
|
|
45872
|
+
["file_type", "json"]
|
|
45873
|
+
]);
|
|
45874
|
+
}
|
|
45856
45875
|
var FredApiClient = class {
|
|
45857
45876
|
client;
|
|
45858
|
-
apiKey;
|
|
45859
45877
|
constructor() {
|
|
45860
|
-
const key = process.env.FRED_API_KEY;
|
|
45861
|
-
if (!key) {
|
|
45862
|
-
throw new Error(
|
|
45863
|
-
"FRED_API_KEY environment variable not set. Please set it to use this server."
|
|
45864
|
-
);
|
|
45865
|
-
}
|
|
45866
|
-
this.apiKey = key;
|
|
45867
45878
|
this.client = axios_default.create({
|
|
45868
45879
|
baseURL: FRED_BASE_URL,
|
|
45869
|
-
params: { api_key: this.apiKey, file_type: "json" },
|
|
45870
45880
|
httpsAgent
|
|
45871
45881
|
});
|
|
45872
45882
|
}
|
|
@@ -45874,13 +45884,13 @@ var FredApiClient = class {
|
|
|
45874
45884
|
const { data } = await this.client.get(
|
|
45875
45885
|
"/series/search",
|
|
45876
45886
|
{
|
|
45877
|
-
params: {
|
|
45887
|
+
params: buildRequestParams({
|
|
45878
45888
|
search_text: query,
|
|
45879
45889
|
limit,
|
|
45880
45890
|
offset,
|
|
45881
45891
|
order_by: "popularity",
|
|
45882
45892
|
sort_order: "desc"
|
|
45883
|
-
}
|
|
45893
|
+
})
|
|
45884
45894
|
}
|
|
45885
45895
|
);
|
|
45886
45896
|
return data;
|
|
@@ -45889,7 +45899,7 @@ var FredApiClient = class {
|
|
|
45889
45899
|
const { data } = await this.client.get(
|
|
45890
45900
|
"/series",
|
|
45891
45901
|
{
|
|
45892
|
-
params: { series_id: seriesId }
|
|
45902
|
+
params: buildRequestParams({ series_id: seriesId })
|
|
45893
45903
|
}
|
|
45894
45904
|
);
|
|
45895
45905
|
return data;
|
|
@@ -45898,12 +45908,12 @@ var FredApiClient = class {
|
|
|
45898
45908
|
const { data } = await this.client.get(
|
|
45899
45909
|
"/series/observations",
|
|
45900
45910
|
{
|
|
45901
|
-
params: {
|
|
45911
|
+
params: buildRequestParams({
|
|
45902
45912
|
series_id: seriesId,
|
|
45903
45913
|
limit,
|
|
45904
45914
|
offset,
|
|
45905
45915
|
sort_order: "desc"
|
|
45906
|
-
}
|
|
45916
|
+
})
|
|
45907
45917
|
}
|
|
45908
45918
|
);
|
|
45909
45919
|
return data;
|
|
@@ -45912,13 +45922,13 @@ var FredApiClient = class {
|
|
|
45912
45922
|
const { data } = await this.client.get(
|
|
45913
45923
|
"/category/series",
|
|
45914
45924
|
{
|
|
45915
|
-
params: {
|
|
45925
|
+
params: buildRequestParams({
|
|
45916
45926
|
category_id: categoryId,
|
|
45917
45927
|
limit,
|
|
45918
45928
|
offset,
|
|
45919
45929
|
order_by: "popularity",
|
|
45920
45930
|
sort_order: "desc"
|
|
45921
|
-
}
|
|
45931
|
+
})
|
|
45922
45932
|
}
|
|
45923
45933
|
);
|
|
45924
45934
|
return data;
|
|
@@ -45927,12 +45937,12 @@ var FredApiClient = class {
|
|
|
45927
45937
|
const { data } = await this.client.get(
|
|
45928
45938
|
"/releases",
|
|
45929
45939
|
{
|
|
45930
|
-
params: {
|
|
45940
|
+
params: buildRequestParams({
|
|
45931
45941
|
limit,
|
|
45932
45942
|
offset,
|
|
45933
45943
|
order_by: "release_id",
|
|
45934
45944
|
sort_order: "desc"
|
|
45935
|
-
}
|
|
45945
|
+
})
|
|
45936
45946
|
}
|
|
45937
45947
|
);
|
|
45938
45948
|
return data;
|
|
@@ -45941,26 +45951,31 @@ var FredApiClient = class {
|
|
|
45941
45951
|
const { data } = await this.client.get(
|
|
45942
45952
|
"/release/series",
|
|
45943
45953
|
{
|
|
45944
|
-
params: {
|
|
45954
|
+
params: buildRequestParams({
|
|
45945
45955
|
release_id: releaseId,
|
|
45946
45956
|
limit,
|
|
45947
45957
|
offset,
|
|
45948
45958
|
order_by: "popularity",
|
|
45949
45959
|
sort_order: "desc"
|
|
45950
|
-
}
|
|
45960
|
+
})
|
|
45951
45961
|
}
|
|
45952
45962
|
);
|
|
45953
45963
|
return data;
|
|
45954
45964
|
}
|
|
45955
45965
|
async getSources() {
|
|
45956
|
-
const { data } = await this.client.get(
|
|
45966
|
+
const { data } = await this.client.get(
|
|
45967
|
+
"/sources",
|
|
45968
|
+
{
|
|
45969
|
+
params: buildRequestParams({})
|
|
45970
|
+
}
|
|
45971
|
+
);
|
|
45957
45972
|
return data;
|
|
45958
45973
|
}
|
|
45959
45974
|
async getSource(sourceId) {
|
|
45960
45975
|
const { data } = await this.client.get(
|
|
45961
45976
|
"/source",
|
|
45962
45977
|
{
|
|
45963
|
-
params: { source_id: sourceId }
|
|
45978
|
+
params: buildRequestParams({ source_id: sourceId })
|
|
45964
45979
|
}
|
|
45965
45980
|
);
|
|
45966
45981
|
return data;
|
|
@@ -46174,25 +46189,36 @@ function getClient() {
|
|
|
46174
46189
|
return clientInstance;
|
|
46175
46190
|
}
|
|
46176
46191
|
function extractErrorMessage(err) {
|
|
46192
|
+
const sanitize = (value) => {
|
|
46193
|
+
const apiKey = process.env.FRED_API_KEY;
|
|
46194
|
+
let sanitized = value.replace(
|
|
46195
|
+
/([?&]api_key=)[^&\s]+/gi,
|
|
46196
|
+
"$1[REDACTED]"
|
|
46197
|
+
);
|
|
46198
|
+
if (apiKey) {
|
|
46199
|
+
sanitized = sanitized.split(apiKey).join("[REDACTED]");
|
|
46200
|
+
}
|
|
46201
|
+
return sanitized;
|
|
46202
|
+
};
|
|
46177
46203
|
if (typeof err !== "object" || err === null) {
|
|
46178
|
-
return String(err);
|
|
46204
|
+
return sanitize(String(err));
|
|
46179
46205
|
}
|
|
46180
46206
|
const error48 = err;
|
|
46181
46207
|
const responseData = error48.response?.data;
|
|
46182
46208
|
if (typeof responseData === "string" && responseData.trim()) {
|
|
46183
|
-
return responseData.trim();
|
|
46209
|
+
return sanitize(responseData.trim());
|
|
46184
46210
|
}
|
|
46185
46211
|
if (responseData && typeof responseData === "object") {
|
|
46186
46212
|
const data = responseData;
|
|
46187
46213
|
const nestedMessage = data.error_message ?? data.message ?? data.error ?? data.detail;
|
|
46188
46214
|
if (nestedMessage !== void 0 && nestedMessage !== null) {
|
|
46189
|
-
return String(nestedMessage);
|
|
46215
|
+
return sanitize(String(nestedMessage));
|
|
46190
46216
|
}
|
|
46191
46217
|
}
|
|
46192
46218
|
if (error48.message !== void 0 && error48.message !== null) {
|
|
46193
|
-
return String(error48.message);
|
|
46219
|
+
return sanitize(String(error48.message));
|
|
46194
46220
|
}
|
|
46195
|
-
return "Request failed.";
|
|
46221
|
+
return sanitize("Request failed.");
|
|
46196
46222
|
}
|
|
46197
46223
|
function handleFredError(err) {
|
|
46198
46224
|
if (typeof err === "object" && err !== null) {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fre4x/fred",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.65-beta.1",
|
|
4
4
|
"description": "A FRED economic data MCP server for LLMs.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
"dev": "tsx src/index.ts",
|
|
18
18
|
"watch": "tsc -w",
|
|
19
19
|
"inspector": "npm run build && node ../scripts/run-official-inspector.mjs node dist/index.js",
|
|
20
|
-
"test": "vitest run --passWithNoTests --exclude dist"
|
|
20
|
+
"test": "node ../scripts/run-vitest.mjs run --passWithNoTests --exclude dist"
|
|
21
21
|
},
|
|
22
22
|
"keywords": [
|
|
23
23
|
"mcp",
|