Skip to content

Commit a5aaaa0

Browse files
committed
feat: Add MCP tools for content management and retrieval
- Implemented McpPageItem DTO for list responses. - Created GetContentDetailTool to fetch complete content details by content ID. - Developed GetContentSummariesTool for batch retrieval of content summaries. - Added GetHighlightsTool to retrieve user-highlighted text passages from articles. - Introduced GetLibraryContentTool to access user's library content by category. - Implemented GetUnreadRssTool to fetch all unread RSS items. - Created ListGithubStarsTool to retrieve recent GitHub stars. - Developed ListRecentContentTool for fetching recently saved content across all sources. - Added ListRssFeedsTool to list all RSS subscriptions with statistics. - Implemented ListRssItemsTool to get articles from a specific RSS feed subscription. - Created ListTweetsTool to retrieve saved tweets with various sort options. - Defined McpTool interface for consistent tool structure. - Implemented SearchContentTool for full-text search across all saved content.
1 parent 9bd8a88 commit a5aaaa0

30 files changed

+2501
-351
lines changed

app/client/src/App.tsx

Lines changed: 29 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import React, {useEffect} from "react";
1+
import React, { useEffect } from "react";
22
import {
33
createBrowserRouter,
44
createRoutesFromElements, createSearchParams,
@@ -19,11 +19,12 @@ import AllFeeds from "./pages/AllFeeds";
1919
import Search from "./pages/Search";
2020
import Twitter from "./pages/Twitter";
2121
import Highlights from "./pages/Highlights";
22-
import {AuthControllerApiFactory} from "./api";
22+
import { AuthControllerApiFactory } from "./api";
2323
import SignIn from "./pages/SignIn";
2424
import { GlobalSettingsProvider } from "./contexts/GlobalSettingsContext";
2525
import Settings from "./pages/settings";
2626
import SettingsGeneral from "./pages/settings/SettingsGeneral";
27+
import SettingsMcp from "./pages/settings/SettingsMcp";
2728
import SettingsAIShortcuts from "./pages/settings/SettingsAIShortcuts";
2829
import SettingsConnect from "./pages/settings/SettingsConnect";
2930
import SettingsFeeds from "./pages/settings/SettingsFeeds";
@@ -35,29 +36,30 @@ function App() {
3536
const router = createBrowserRouter(
3637
createRoutesFromElements(
3738
<Route>
38-
<Route path="/signin" element={<SignIn/>}/>
39-
<Route element={<Layout/>}>
40-
<Route index element={<Home/>}/>
41-
<Route path={"/recently-read"} element={<RecentlyRead/>}/>
42-
<Route path={"/list"} element={<MyList/>}/>
43-
<Route path={"/starred"} element={<Starred/>}/>
44-
<Route path={"/later"} element={<ReadLater/>}/>
45-
<Route path={"/archive"} element={<Archive/>}/>
46-
<Route path="/page/:id" element={<Page/>}/>
47-
<Route path="/connector/:id" element={<ConnectorList/>}/>
48-
<Route path="/folder/:id" element={<FolderList/>}/>
49-
<Route path="/feeds" element={<AllFeeds/>}/>
50-
<Route path="/search" element={<Search/>}/>
51-
<Route path="/twitter" element={<Twitter/>}/>
52-
<Route path="/highlights" element={<Highlights/>}/>
53-
<Route path="/settings" element={<Settings/>}/>
54-
<Route path="/settings/general" element={<SettingsGeneral/>}/>
55-
<Route path="/settings/ai-shortcuts" element={<SettingsAIShortcuts/>}/>
56-
<Route path="/settings/connect" element={<SettingsConnect/>}/>
57-
<Route path="/settings/feeds" element={<SettingsFeeds/>}/>
58-
<Route path="/settings/folders" element={<SettingsFolders/>}/>
59-
<Route path="/settings/library" element={<SettingsLibrary/>}/>
60-
<Route path="/settings/account" element={<SettingsAccount/>}/>
39+
<Route path="/signin" element={<SignIn />} />
40+
<Route element={<Layout />}>
41+
<Route index element={<Home />} />
42+
<Route path={"/recently-read"} element={<RecentlyRead />} />
43+
<Route path={"/list"} element={<MyList />} />
44+
<Route path={"/starred"} element={<Starred />} />
45+
<Route path={"/later"} element={<ReadLater />} />
46+
<Route path={"/archive"} element={<Archive />} />
47+
<Route path="/page/:id" element={<Page />} />
48+
<Route path="/connector/:id" element={<ConnectorList />} />
49+
<Route path="/folder/:id" element={<FolderList />} />
50+
<Route path="/feeds" element={<AllFeeds />} />
51+
<Route path="/search" element={<Search />} />
52+
<Route path="/twitter" element={<Twitter />} />
53+
<Route path="/highlights" element={<Highlights />} />
54+
<Route path="/settings" element={<Settings />} />
55+
<Route path="/settings/general" element={<SettingsGeneral />} />
56+
<Route path="/settings/mcp" element={<SettingsMcp />} />
57+
<Route path="/settings/ai-shortcuts" element={<SettingsAIShortcuts />} />
58+
<Route path="/settings/connect" element={<SettingsConnect />} />
59+
<Route path="/settings/feeds" element={<SettingsFeeds />} />
60+
<Route path="/settings/folders" element={<SettingsFolders />} />
61+
<Route path="/settings/library" element={<SettingsLibrary />} />
62+
<Route path="/settings/account" element={<SettingsAccount />} />
6163
</Route>
6264
</Route>
6365
)
@@ -77,10 +79,10 @@ function App() {
7779
});
7880
}
7981
}, []);
80-
82+
8183
return (
8284
<GlobalSettingsProvider>
83-
<RouterProvider router={router}/>
85+
<RouterProvider router={router} />
8486
</GlobalSettingsProvider>
8587
// <Routes>
8688
// <Route path="/signin" element={<SignIn/>}/>

app/client/src/api/api.ts

Lines changed: 294 additions & 288 deletions
Large diffs are not rendered by default.

app/client/src/components/SettingModal/GeneralSetting.tsx

Lines changed: 24 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
1-
import {useSnackbar} from "notistack";
2-
import {useQuery} from "@tanstack/react-query";
3-
import {SettingControllerApiFactory} from "../../api";
4-
import {useFormik} from "formik";
1+
2+
import { useSnackbar } from "notistack";
3+
import { useQuery } from "@tanstack/react-query";
4+
import { SettingControllerApiFactory } from "../../api";
5+
import { useFormik } from "formik";
56
import * as yup from "yup";
67
import Typography from "@mui/material/Typography";
78
import {
@@ -18,9 +19,9 @@ import React from "react";
1819
import HelpOutlineIcon from '@mui/icons-material/HelpOutline';
1920

2021
export default function GeneralSetting() {
21-
const {enqueueSnackbar} = useSnackbar();
22+
const { enqueueSnackbar } = useSnackbar();
2223
const api = SettingControllerApiFactory();
23-
const [needChangeOpenApiKey,setNeedChangeOpenApiKey] = React.useState(false);
24+
const [needChangeOpenApiKey, setNeedChangeOpenApiKey] = React.useState(false);
2425

2526
const {
2627
data: globalSetting
@@ -50,12 +51,12 @@ export default function GeneralSetting() {
5051
api.saveGlobalSettingUsingPOST(values).then((res) => {
5152
enqueueSnackbar('General setting save success.', {
5253
variant: "success",
53-
anchorOrigin: {vertical: "bottom", horizontal: "center"}
54+
anchorOrigin: { vertical: "bottom", horizontal: "center" }
5455
});
5556
}).catch((err) => {
5657
enqueueSnackbar('General setting save failed. Error: ' + err, {
5758
variant: "error",
58-
anchorOrigin: {vertical: "bottom", horizontal: "center"}
59+
anchorOrigin: { vertical: "bottom", horizontal: "center" }
5960
});
6061
})
6162
}
@@ -66,7 +67,7 @@ export default function GeneralSetting() {
6667
<Typography variant={'h6'} className={''}>
6768
AI Service Provider
6869
</Typography>
69-
<Divider/>
70+
<Divider />
7071

7172
<div className={'mt-2 flex items-center'}>
7273
<TextField
@@ -87,7 +88,7 @@ export default function GeneralSetting() {
8788
{
8889
formikGeneral.initialValues.openApiKey && formikGeneral.initialValues.openApiKey.length > 0 &&
8990
<div>
90-
<Button onClick={()=>{setNeedChangeOpenApiKey(true)}}>Change</Button>
91+
<Button onClick={() => { setNeedChangeOpenApiKey(true) }}>Change</Button>
9192
</div>
9293
}
9394
</div>
@@ -121,15 +122,15 @@ export default function GeneralSetting() {
121122
/>
122123
<Tooltip title="Optional settings for custom OpenAI-compatible APIs" placement="right">
123124
<IconButton size="small" className={'ml-2'}>
124-
<HelpOutlineIcon className={'text-gray-400'}/>
125+
<HelpOutlineIcon className={'text-gray-400'} />
125126
</IconButton>
126127
</Tooltip>
127128
</div>
128129

129130
<Typography variant={'h6'} className={'mt-4'}>
130131
Http Proxy
131132
</Typography>
132-
<Divider/>
133+
<Divider />
133134
<div className={'mt-3 flex items-center'}>
134135
<TextField
135136
margin="dense"
@@ -158,16 +159,18 @@ export default function GeneralSetting() {
158159
size={"small"}
159160
/>
160161
<FormControlLabel className={'ml-2'}
161-
control={<Checkbox value={true} name={'enableProxy'} onChange={formikGeneral.handleChange}
162-
checked={!!formikGeneral.values.enableProxy}/>
163-
}
164-
label="Enable"/>
162+
control={<Checkbox value={true} name={'enableProxy'} onChange={formikGeneral.handleChange}
163+
checked={!!formikGeneral.values.enableProxy} />
164+
}
165+
label="Enable" />
165166
</div>
166167

168+
169+
167170
<Typography variant={'h6'} className={'mt-4'}>
168171
Automation
169172
</Typography>
170-
<Divider/>
173+
<Divider />
171174
<div className={'mt-2 flex items-center'}>
172175
<TextField
173176
margin="dense"
@@ -184,15 +187,15 @@ export default function GeneralSetting() {
184187
/>
185188
<Tooltip title="Cold data: Unsaved browser history articles." placement="right">
186189
<IconButton size="small" className={'ml-2'}>
187-
<HelpOutlineIcon className={'text-gray-400'}/>
190+
<HelpOutlineIcon className={'text-gray-400'} />
188191
</IconButton>
189192
</Tooltip>
190193
</div>
191194

192195
<Typography variant={'h6'} className={'mt-4'}>
193196
Website Blacklist
194197
</Typography>
195-
<Divider/>
198+
<Divider />
196199

197200
<div className={'mt-2 flex items-center'}>
198201
<TextField
@@ -222,6 +225,6 @@ export default function GeneralSetting() {
222225
Save
223226
</Button>
224227
</div>
225-
</form>
226-
</div>
228+
</form >
229+
</div >
227230
}

0 commit comments

Comments
 (0)